この形質が現在実装されている特定のタイプのみを返す必要がある場合は、Self
を探している可能性があります。形質を使用して実証し、充実した一例を
trait A {
fn new() -> Self;
}
struct Person;
impl A for Person {
fn new() -> Person {
Person
}
}
をまたは::
trait A {
fn new() -> Self;
}
例えば、これは、コンパイルします
trait A {
fn new<S: Into<String>>(name: S) -> Self;
fn get_name(&self) -> String;
}
struct Person {
name: String
}
impl A for Person {
fn new<S: Into<String>>(name: S) -> Person {
Person { name: name.into() }
}
fn get_name(&self) -> String {
self.name.clone()
}
}
struct Pet {
name: String
}
impl A for Pet {
fn new<S: Into<String>>(name: S) -> Pet {
Pet { name: name.into() }
}
fn get_name(&self) -> String {
self.name.clone()
}
}
fn main() {
let person = Person::new("Simon");
let pet = Pet::new("Buddy");
println!("{}'s pets name is {}", get_name(&person), get_name(&pet));
}
fn get_name<T: A>(a: &T) -> String {
a.get_name()
}
Playground
を注意点として..私はString
をここでは&str
の参考にして使った。明示的な生涯の必要性と、潜在的には手元の問題への焦点の欠如。コンテンツを借用するときには&str
参照を返すのが一般的にはコンベンションだと思うが、それはここでは適切だと思われる。しかし、実際の例をあまりにも邪魔したくない。
hhh;可能であるかどうか分からなかった!どうもありがとうございました。 – Ameo
大歓迎です! :) –
これは 'impl Trait'を返すのと同じではありません。たとえば、 'Person'が' Pet'を返すメソッドを追加することはできませんが、 'Pet'は' Person'を返しますが、両方とも 'A'を実装します。 [RFC(1522)](https://github.com/rust-lang/rfcs/blob/master/text/1522-conservative-impl-trait.md)にはこの制限が記載されており、最終的にそれを削除したいという願いが表明されています「初期制限」の最初の箇条書き)。 – trentcl