对于“& str”类型没有实现特征[E0277]

时间:2016-01-28 15:04:14

标签: rust traits

我有一个str的特征定义,我定义了一个函数take&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()
//     }
// }

1 个答案:

答案 0 :(得分:2)

你需要告诉method_on_trait它可以在unsized类型上工作并向它传递一个对T的引用(不是直接T,此时可能没有大小,也不能通过值传递)。 首先,您可以将?Sized“绑定”添加到T,第二个是将thing添加到&T

fn method_on_trait<T: MyTrait + ?Sized> (thing: &T) {
   let v = thing.to_thingie();
   println!("Method on trait: {:?}",v);
}

这里发生了什么,是MyTrait仅针对str实施,&'static str是未归类的类型。您尝试将“test”(这是method_on_trait)传递给main中的E0277,这会导致MyTrait错误。

您的评论代码正在为&str实施&str,这会使您的原始代码编译,因为您确实将method_on_trait传递给&str。没有复制原始字符串,webdriver.firefox.bin=/path/to/your/firefox.exe 基本上只是a pointer to it plus a length info