Rust 类型“”未实现Trait;str`[E0277]

Rust 类型“”未实现Trait;str`[E0277],rust,traits,Rust,Traits,我对str有一个特征定义,其中我定义了一个函数&self。如果我在static&str上从main调用这个函数,一切都很好。如果我从使用trait对象参数的函数调用同一个函数,我会遇到以下错误:MyTrait没有为类型实现&str[E0277] 最后我有一个解决办法,但我不清楚成本,我是在复制字符串吗 #[derive(Debug)] struct Thingie{ pub name: String, // rather than &a str for Thingie<'a>

我对str有一个特征定义,其中我定义了一个函数&self。如果我在static&str上从main调用这个函数,一切都很好。如果我从使用trait对象参数的函数调用同一个函数,我会遇到以下错误:
MyTrait没有为类型实现
&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()
//     }
// }
#[派生(调试)]
结构物{
发布名称:String,//而不是&str表示Thingie MyTrait表示&str{
//fn to_thingie(&self)->选项{

//println!(“>>MyTrait您需要告诉
method\u on\u trait
,它可以处理未大小的类型,并将引用传递给T(而不是直接传递给T,此时T可能没有大小,也不能通过值传递)。 第一种方法是将
大小的
绑定到
T
,第二种方法是将
东西变成
&T

fn method_on_trait<T: MyTrait + ?Sized> (thing: &T) {
   let v = thing.to_thingie();
   println!("Method on trait: {:?}",v);
}
fn基于特征的方法(事物:&T){
让v=thing.to_thingie();
println!(“特征上的方法:{:?}”,v);
}
这里发生的事情是,
MyTrait
只为
str
实现,这是一种未大小化的类型。您尝试通过“test”(这是一种
&'static str
)以在main中通过
方法\u-on\u-trait
,从而导致
E0277
错误


您的注释代码正在为
&str
实现
MyTrait
,这使您的原始代码得以编译,因为您确实正在将
&str
传递给
trait
上的方法。\u trait
上没有复制原始字符串,
&str
只是基本上而已。

我不知道这是否是一种良好的礼仪,这里是这个代码片段的链接:谢谢,我完全忘记了?大小的特性。我想感谢你对@Pablo的非常清晰和详细的解释。这非常有用。