我有一個特性,我想提供一種方法。這個方法是用一些幫助者來實現的,這些幫助者沒有任何業務在這個特徵之內,並且不夠平凡,以至於動態多態性比使它們通用更有意義。所以,我必須沿着提供的方法鑄造和自我特質對象
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();
}
,然而,does not compile的行代碼,出現錯誤:
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 where T: Trait
轉換爲&Trait
需要T: Sized
,但聲明不需要)。
但是,建議不會做我需要的。我可以添加
fn needed(&self) -> &str where Self: Sized
但隨後needed()
方法不會上&Trait
(因爲Trait : ?Sized
),這使得事情無用訪問,因爲類型(實際的一個做一些有用的東西)是總是處理爲Arc<Trait>
。並加入
trait Trait: Sized
更差,因爲不允許在所有&Trait
(Trait
作爲一個類型爲未分級的,所以Trait
類型不不落實特質Trait
)。
當然,我可以簡單地
fn use_trait<T: Trait>(x: &T)
,但有很多背後的實際代碼,所以我不想monomorphisation有尤其是自性狀;否則,始終爲特質對象處理。
有沒有什麼辦法可以告訴Rust所有impl Trait
都必須調整大小的類型,這裏有一個方法的定義應該適用於所有類型?
另請參見[Rust Trait對象轉換](http://stackoverflow.com/q/41604107/155423) – Shepmaster