我在理解如何使用特征和所有权方面遇到了一些麻烦。以下示例有效:
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)
,则此功能正常。我的期望是用特征取代类型,一切都会奏效。
答案 0 :(得分:3)
问题在于您尝试将&&T
传递给f2
。这意味着它希望&T
实现XT
,并且不您所说的内容:您说T
实现了XT
。
您可以修改f1
以使用where T: XT, for<'a> &'a T: XT
子句正确表达此约束,但之后您无法从f1
致电main
,因为&X
没有实现XT
。所以你去为添加的实现,然后然后代码可以工作......但老实说,删除&
并调用它会更容易而是f2(x)
。
换句话说:只是因为类型实现了特征不指向该类型的指针也实现特征。