[英]Error returning reference to a temporary value when implementing a trait for a type reference
[英]Unable to call a function with a reference to a type implementing a trait
我在了解如何使用特征和所有權時遇到了一些麻煩。 以下示例起作用:
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);
}
但是當我嘗試使用get
創建特征(此處為XT
)時:
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);
}
無法編譯以下錯誤消息:
沒有為
&T
類型實現特征XT
它的工作原理,如果我改變f2(&x)
以f2(x)
我的期望是,用特征替換類型,一切都會正常。
問題是您正在嘗試將&&T
傳遞給f2
。 這意味着它期望&T
實現XT
,但這不是您所說的:您說T
實現了XT
。
您可以使用where T: XT, for<'a> &'a T: XT
子句來修改f1
以正確表達此約束,但是由於&X
沒有實現XT
,因此您不能從main
調用f1
。 所以,你去添加一個實現該為好 , 然后代碼工作......但說實話,它更容易只是刪除&
和調用f2(x)
來代替。
換句話說,僅僅因為類型實現了特征並不意味着指向該類型的指針也實現了特征。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.