未为类型 `&str` 实现特征 [E0277]
Trait is not implemented for the type `&str` [E0277]
我有一个 str 的特征定义,我在其中定义了一个采用 &self 的函数。如果我在静态 &str 上从 main 调用这个函数,一切都很好。如果我从一个带有特征对象参数的函数调用相同的函数,我会收到以下错误:MyTrait is not implemented for the type
&str[E0277]
最后我有一个解决方法,但我不清楚成本,我是在复制字符串吗?
#[derive(Debug)]
struct Thingie{
pub name: String, // rather than &a str for Thingie<'a>
}
trait MyTrait{
fn to_thingie(&self)->Option<Thingie>;
}
impl MyTrait for str{
fn to_thingie(&self)->Option<Thingie>{
println!(">>MyTrait for str");
Some(Thingie{name:self.to_string()})
}
}
fn method_on_trait <T:MyTrait> (thing:T){
let v= thing.to_thingie();
println!("Method on trait: {:?}",v);
}
fn main(){
println!("in main: {:?}","test".to_thingie());
method_on_trait("test");
}
//TODO: Uncomment this for a fix. WHY?
//Is this creating a copy of the string or just transfering the binding?
// impl<'a> MyTrait for &'a str{
// fn to_thingie(&self)->Option<Thingie>{
// println!(">>MyTrait<'a> for &'a str");
// (*self).to_thingie()
// }
// }
您需要告诉 method_on_trait
它可以处理未调整大小的类型并将它传递给 T 的引用(不是直接 T,此时它可能没有调整大小并且不能按值传递) .
第一种方法是将 ?Sized
"bound" 添加到 T
,第二种方法是将 thing
设为 &T
.
fn method_on_trait<T: MyTrait + ?Sized> (thing: &T) {
let v = thing.to_thingie();
println!("Method on trait: {:?}",v);
}
这里发生的事情是,MyTrait
仅针对 str
实现,这是一个未调整大小的类型。您尝试在 main 中将 "test"(这是一个 &'static str
)传递给 method_on_trait
,这会导致 E0277
错误。
您注释的代码正在为 &str
实现 MyTrait
,这使得您的原始代码可以编译,因为您确实将 &str
传递给了 method_on_trait
。没有复制原始字符串, &str
基本上只是 a pointer to it plus a length info.
我有一个 str 的特征定义,我在其中定义了一个采用 &self 的函数。如果我在静态 &str 上从 main 调用这个函数,一切都很好。如果我从一个带有特征对象参数的函数调用相同的函数,我会收到以下错误:MyTrait is not implemented for the type
&str[E0277]
最后我有一个解决方法,但我不清楚成本,我是在复制字符串吗?
#[derive(Debug)]
struct Thingie{
pub name: String, // rather than &a str for Thingie<'a>
}
trait MyTrait{
fn to_thingie(&self)->Option<Thingie>;
}
impl MyTrait for str{
fn to_thingie(&self)->Option<Thingie>{
println!(">>MyTrait for str");
Some(Thingie{name:self.to_string()})
}
}
fn method_on_trait <T:MyTrait> (thing:T){
let v= thing.to_thingie();
println!("Method on trait: {:?}",v);
}
fn main(){
println!("in main: {:?}","test".to_thingie());
method_on_trait("test");
}
//TODO: Uncomment this for a fix. WHY?
//Is this creating a copy of the string or just transfering the binding?
// impl<'a> MyTrait for &'a str{
// fn to_thingie(&self)->Option<Thingie>{
// println!(">>MyTrait<'a> for &'a str");
// (*self).to_thingie()
// }
// }
您需要告诉 method_on_trait
它可以处理未调整大小的类型并将它传递给 T 的引用(不是直接 T,此时它可能没有调整大小并且不能按值传递) .
第一种方法是将 ?Sized
"bound" 添加到 T
,第二种方法是将 thing
设为 &T
.
fn method_on_trait<T: MyTrait + ?Sized> (thing: &T) {
let v = thing.to_thingie();
println!("Method on trait: {:?}",v);
}
这里发生的事情是,MyTrait
仅针对 str
实现,这是一个未调整大小的类型。您尝试在 main 中将 "test"(这是一个 &'static str
)传递给 method_on_trait
,这会导致 E0277
错误。
您注释的代码正在为 &str
实现 MyTrait
,这使得您的原始代码可以编译,因为您确实将 &str
传递给了 method_on_trait
。没有复制原始字符串, &str
基本上只是 a pointer to it plus a length info.