0

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

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). 我的期望是用特征替换类型,一切都会奏效。

4

1 回答 1

3

问题是你试图传递&&Tf2. 这意味着它期望&T实现XT,这不是你所说的:你说的是T实现XT

f1您可以通过使用子句进行修改以正确表达此约束where T: XT, for<'a> &'a T: XT,但是您不能调用f1frommain因为&X没有实现XT. 所以你也去添加一个实现然后代码&可以工作了……但老实说,删除它并调用它更容易f2(x)

换句话说:仅仅因为一个类型实现了一个 trait并不意味着指向该类型的指针实现了这个 trait。

于 2015-09-27T05:13:29.503 回答