Tôi có một đặc điểm mà tôi muốn cung cấp một phương pháp. Phương pháp này sẽ được thực hiện theo một số người trợ giúp không có doanh nghiệp nào bên trong đặc điểm và không đủ tầm thường để đa hình năng động có ý nghĩa hơn là làm cho chúng trở nên chung chung. Vì vậy, tôi có mã dọc theo dòng củaPhương thức đúc & tự đối tượng được cung cấp
fn use_trait(x: &Trait) {
println!("object says {}", x.needed());
}
trait Trait {
fn needed(&self) -> &str;
fn provided(&self) {
use_trait(self);
}
}
struct Struct();
impl Trait for Struct {
fn needed(&self) -> &str {
"Hello, world!"
}
}
fn main() {
Struct().provided();
}
nào, tuy nhiên, does not compile, với lỗi:
error[E0277]: the trait bound `Self: std::marker::Sized` is not satisfied
--> <anon>:9:19
|
9 | use_trait(self);
| ^^^^ the trait `std::marker::Sized` is not implemented for `Self`
|
= help: consider adding a `where Self: std::marker::Sized` bound
= note: required for the cast to the object type `Trait`
Tôi hiểu tại sao-nó không được bảo đảm ai đó sẽ không thực hiện các đặc điểm cho một loại không đúng cở (chuyển đổi từ &T where T: Trait
thành &Trait
yêu cầu T: Sized
, nhưng việc khai báo không yêu cầu điều đó).
Tuy nhiên, lời khuyên sẽ không làm những gì tôi cần. Tôi có thể thêm
fn needed(&self) -> &str where Self: Sized
nhưng sau đó needed()
phương pháp sẽ không có thể truy cập vào &Trait
(vì Trait : ?Sized
), trong đó ám chỉ rằng điều vô ích, bởi vì các loại (một trong những thực tế mà làm điều gì đó hữu ích) là luôn được xử lý là Arc<Trait>
. Và thêm
trait Trait: Sized
thậm chí còn tồi tệ hơn, bởi vì đó không cho phép &Trait
ở tất cả (Trait
như một loại là không đúng cở, vì vậy Trait
loại không không thực hiện đặc điểm Trait
).
Dĩ nhiên tôi chỉ đơn giản có thể làm cho
fn use_trait<T: Trait>(x: &T)
nhưng có rất nhiều đằng sau đó trong các mã sản, vì vậy tôi không muốn monomorphisation có đặc biệt là kể từ khi đặc điểm là nếu không luôn luôn xử lý như đối tượng tính trạng.
Có cách nào để nói với Rust rằng tất cả các loại mà impl Trait
phải có kích thước và đây là định nghĩa về một phương pháp sẽ hoạt động cho tất cả chúng?
Xem thêm [đối tượng Trait đối tượng Rust Trait] (http://stackoverflow.com/q/41604107/155423) – Shepmaster