2016-01-28 33 views
2

我有一个str的特性定义,我定义了一个函数,其自身为&。如果我从静态的& str的main调用这个函数,一切都很好。如果我把从一个函数取一个特征对象参数相同的功能,我招呼着以下错误:MyTrait is not implemented for the type & STR [E0277]特性不适用于'&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() 
//  } 
// } 
+0

我不知道这是否是一种好的礼仪,下面是这段代码片段的铁锈乐园链接:https://play.rust-lang.org/?gist=10bd0d565e9106e1900c&version=stable –

回答

2

你需要告诉method_on_trait它可以在未分级的工种,并把它传递给T(不直接T,它在这一点上可能没有大小,不能按值传递)的参考。 您可以首先将?Sized“绑定”到T,第二个可以通过thing a &T进行添加。

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

这是怎么回事,是MyTrait只为str实现,这是一个无胶式。您尝试通过“测试”(这是一个&'static str)到method_on_trait主,这导致E0277错误。

您的评论的代码实现MyTrait&str,这使得原来的代码编译,因为你确实传递&strmethod_on_trait。没有复制原始字符串,&str基本上只有a pointer to it plus a length info

+0

谢谢,我完全忘记了“大小特质”。 –

+0

我要感谢你对@Pablo的非常清晰和详细的解释。这非常有帮助。 –

相关问题