Nếu bạn chỉ cần trả lại loại cụ thể mà đặc điểm hiện đang được triển khai, bạn có thể đang tìm kiếm Self
.
trait A {
fn new() -> Self;
}
Ví dụ, điều này sẽ biên dịch:
trait A {
fn new() -> Self;
}
struct Person;
impl A for Person {
fn new() -> Person {
Person
}
}
Hoặc một ví dụ đầy đủ hơn, thể hiện bằng cách sử dụng đặc điểm:
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
Như một mặt lưu ý .. Tôi đã sử dụng String
ở đây có lợi cho tài liệu tham khảo &str
.. để giảm e sự cần thiết cho cuộc sống rõ ràng và có khả năng mất tập trung vào câu hỏi trong tầm tay. Tôi tin rằng nó thường là quy ước để trở về một tài liệu tham khảo &str
khi vay nội dung và có vẻ thích hợp ở đây .. tuy nhiên tôi không muốn đánh lạc hướng từ ví dụ thực tế quá nhiều.
Nguồn
2016-09-14 03:43:10
Huh; không có ý tưởng đó là có thể! Cảm ơn nhiều. – Ameo
Bạn đang rất hoan nghênh! :) –
Điều này không giống như trả về 'impl Trait'. Ví dụ, bạn không thể thêm một phương thức mà trong 'Person' trả về một' Pet' nhưng trong 'Pet' trả về một' Person', mặc dù cả hai đều thực thi 'A'. [RFC (1522)] (https://github.com/rust-lang/rfcs/blob/master/text/1522-conservative-impl-trait.md) đề cập đến giới hạn này và thể hiện mong muốn cuối cùng loại bỏ nó (viên đạn đầu tiên trong "Giới hạn ban đầu"). – trentcl