无法通过引用实现特征的类型来调用函数

时间:2015-09-27 04:47:59

标签: rust traits ownership borrowing

我在理解如何使用特征和所有权方面遇到了一些麻烦。以下示例有效:

struct X([u8; 4]);

impl X {
   pub fn get(&self, n: usize) -> u8 {
       self.0[n]
   }
}

fn f1(x: &X) {
    println!("{}", x.get(1));
    f2(&x);
}

fn f2(x: &X) {
    println!("{}", x.get(2));    
}

fn main() {
    let z1 = X([1u8, 2u8, 3u8, 4u8]);
    f1(&z1);
}

但是当我尝试使用XT创建特征(此处get)时:

trait XT {
  fn get(&self, n: usize) -> u8;
}

struct X([u8; 4]);

impl XT for X {
   fn get(&self, n: usize) -> u8 {
       self.0[n]
   }
}

fn f1<T: XT>(x: &T) {
    println!("{}", x.get(1));
    f2(&x);
}

fn f2<T: XT>(x: &T) {
    println!("{}", x.get(2));    
}

fn main() {
    let z1 = X([1u8, 2u8, 3u8, 4u8]);
    f1(&z1);
}

无法使用以下错误消息进行编译:

  

特征XT未针对类型&T

实施

如果我将f2(&x)更改为f2(x),则此功能正常。我的期望是用特征取代类型,一切都会奏效。

1 个答案:

答案 0 :(得分:3)

问题在于您尝试将&&T传递给f2。这意味着它希望&T实现XT,并且您所说的内容:您说T实现了XT

您可以修改f1以使用where T: XT, for<'a> &'a T: XT子句正确表达此约束,但之后您无法从f1致电main,因为&X没有实现XT。所以你去为添加的实现,然后然后代码可以工作......但老实说,删除&并调用它会更容易而是f2(x)

换句话说:只是因为类型实现了特征指向该类型的指针实现特征。