Как явно вызвать функцию из определенной черты - PullRequest
0 голосов
/ 15 июня 2019

Я хотел бы знать, как вызвать функцию из черты, при условии, что есть несколько черт с одинаковыми именами функций.

Проблема в 33 строке или tr1::tr(v);

Как мне выразить, какую черту я хочу назвать?

struct V2D {
  x: i32,
  y: i32
}

impl V2D {
  fn new(x: i32, y: i32) -> V2D {
    V2D{x,y}
  }
}

trait tr1 {
  fn tr();
}

trait tr2 {
  fn tr();
}

impl tr1 for V2D {
  fn tr() {
    println!("This is tr1");
  }
}
impl tr2 for V2D {
  fn tr() {
    println!("This is tr2");
  }
}

fn main() {
  let v = V2D::new(1,2);
  tr1::tr(v);
}

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Самый простой способ - использовать полный синтаксис . В вашем случае tr является ассоциированной функцией, поэтому все, что вам нужно, это небольшая типизация:

fn main() {
  let v = V2D::new(1,2);
  <V2D as tr1>::tr();
  <V2D as tr2>::tr();
}

С другой стороны, синтаксис для методов будет выглядеть примерно так:

struct V2D {
  x: i32,
  y: i32
}

impl V2D {
  fn new(x: i32, y: i32) -> V2D {
    V2D{x,y}
  }
}

trait tr1 {
  fn tr(&self);
}

trait tr2 {
  fn tr(&self);
}

impl tr1 for V2D {
  fn tr(&self) {
    println!("This is tr1");
  }
}
impl tr2 for V2D {
  fn tr(&self) {
    println!("This is tr2");
  }
}

fn main() {
  let v = V2D::new(1,2);
  tr1::tr(&v);
}
0 голосов
/ 15 июня 2019

Синтаксис, который вы использовали (tr1::tr(v)), будет правильным, если ваш метод имеет параметр self ( Постоянная ссылка на игровую площадку ), но если это не так, вам нужно вызвать это на тип, указывающий тип и черту явно:

<V2D as tr1>::tr()

( Постоянная ссылка на игровую площадку )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...