如何从某些特征显式调用函数

时间:2019-06-15 16:12:08

标签: rust

如果有多个具有相同功能名称的特征,我想知道如何从特征中调用函​​数。

问题出在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 :(得分:0)

如果您使用的方法具有tr1::tr(v)参数(Permalink to the playground),则您使用的语法(self)是正确的,但是如果没有,则需要调用它在明确指定类型和特征的类型上:

<V2D as tr1>::tr()

Permalink to the playground

答案 1 :(得分:0)

最简单的方法是使用fully qualified syntax。在您的情况下,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);
}