是否可以在特征中使用构造函数?

时间:2015-08-08 18:44:06

标签: rust

我正在尝试在特征中找到构造函数的示例,但没有太多运气。这是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

转换它会返回一个core :: marker :: Sized相关错误。

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

1 个答案:

答案 0 :(得分:9)

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

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

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