Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

rust - Is it possible to have a constructor function in a trait?

I'm trying to find examples for constructor functions in traits, but haven't had much luck. Is this a idiomatic thing to do in 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

Casting this returns a core::marker::Sized related error.

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
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You need to use the Self type. In trait declarations, Self refers to the type that implements a trait. In your case, the trait declaration should look as follows:

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

Your original version is subtly different because it will return a trait object, not a value of the implementor type.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...