2015-08-08 69 views
5

我试图找到构造函数的特征的例子,但没有多少运气。这是一个在Rust里习惯的事情吗?有没有可能在特质中有构造函数?

trait A { 
    fn new() -> A; 
} 

struct B; 
impl A for B { 
    fn new() -> B { 
     B 
    } 
} 

fn main() { 
    println!("message") 
} 
<anon>:7:8: 9:9 error: method `new` has an incompatible type for trait: expected trait A, found struct `B` [E0053] 
<anon>:7  fn new() -> B { 
<anon>:8   B 
<anon>:9  } 
<anon>:7:8: 9:9 help: see the detailed explanation for E0053 
error: aborting due to previous error 
playpen: application terminated with error code 101 

铸造这将返回一个核心::标志::大中相关的错误。

trait A { 
    fn new() -> A; 
} 

struct B; 
impl A for B { 
    fn new() -> A { 
     B as A 
    } 
} 

fn main() { 
    println!("message") 
} 
<anon>:8:10: 8:16 error: cast to unsized type: `B` as `A` 
<anon>:8   B as A 
        ^~~~~~ 
<anon>:8:10: 8:11 help: consider using a box or reference as appropriate 
<anon>:8   B as A 
       ^
<anon>:7:20: 7:21 error: the trait `core::marker::Sized` is not implemented for the type `A + 'static` [E0277] 
<anon>:7  fn new() -> A { 
          ^
<anon>:7:20: 7:21 note: `A + 'static` does not have a constant size known at compile-time 
<anon>:7  fn new() -> A { 
          ^
error: aborting due to 2 previous errors 
playpen: application terminated with error code 101 
+0

不完全确定你在找什么,但是改变你的第二行为'fn new() - > Self;'做你想做的事? – fjh

+0

是的。它确实有效。这种做我想做的。你可以请回复,我会接受吗? – 6D65

+0

请注意,Rust风格是4格缩进。 – Shepmaster

回答

8

您需要使用Self类型。在特征声明中,Self是指实现特征的类型。在你的情况,性状声明应如下所示:

trait A { 
    fn new() -> Self; // Self stands for any type implementing A 
} 

您的原始版本略有不同,因为它会返回一个trait object,而不是实现者类型的值。

相关问题