2015-08-08 24 views
5

Ich versuche, Beispiele für Konstruktorfunktionen in Merkmalen zu finden, hatte aber nicht viel Glück. Ist das eine idiomatische Sache in Rust?Ist es möglich, eine Konstruktorfunktion in einem Merkmal zu haben?

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 

dieses Casting gibt einen Kern :: Marker :: Sized ähnliche Fehler.

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

Nicht ganz sicher, was Sie suchen, aber ändert Ihre zweite Zeile zu 'fn new() -> Self;' tun, was Sie wollen? – fjh

+0

Ja. Es funktioniert in der Tat. Und es macht was ich wollte. Könnten Sie bitte antworten und ich werde es akzeptieren? – 6D65

+0

Bitte beachten Sie, dass die Rust-Stil 4-Raum-Eindruck ist. – Shepmaster

Antwort

8

Sie müssen die Self Typ verwenden. In Merkmalsdeklarationen bezieht sich Self auf den Typ, der ein Merkmal implementiert. In Ihrem Fall sollte die Eigenschaft Erklärung wie folgt aussehen:

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

Ihre ursprüngliche Version ist auf subtile Weise anders, weil es ein trait object zurückkehren, nicht ein Wert des Implementierer-Typs.

Verwandte Themen