Mam cechę, w której chcę zapewnić metodę. Metodę tę należy wdrożyć w kategoriach niektórych pomocników, którzy nie mają żadnego biznesu w obrębie cechy i nie są wystarczająco banalni, aby dynamiczny polimorfizm miał więcej sensu niż uczynienie ich ogólnymi. Więc mam kod wzdłuż liniiDostarczona metoda odlewania i własna cecha obiektu
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();
}
które jednak does not compile, z błędem:
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`
rozumiem dlaczego-to nie jest gwarantowana ktoś nie będzie stanowić cechę dla typu niezagruntowanej (konwersja z &T where T: Trait
na &Trait
wymaga T: Sized
, ale deklaracja tego nie wymaga).
Jednak porady nie zrobią tego, czego potrzebuję. Mogę dodać
fn needed(&self) -> &str where Self: Sized
ale wtedy metoda needed()
nie będą dostępne na &Trait
(bo Trait : ?Sized
), co sprawia, że rzeczy bezużyteczne, ponieważ typ (rzeczywisty, który robi coś pożytecznego) jest zawsze traktowane jako Arc<Trait>
. I dodając
trait Trait: Sized
jest jeszcze gorzej, bo nie pozwala &Trait
na wszystkich (Trait
jako typ jest nieklejony, więc Trait
typ robi nie wdrożyć cechę Trait
).
Oczywiście mogę po prostu zrobić
fn use_trait<T: Trait>(x: &T)
ale jest dużo za nim w realnym kodzie, więc nie chcę monomorphisation tam zwłaszcza, że cecha jest inaczej zawsze traktowane jako cecha obiektu.
Czy istnieje sposób, aby powiedzieć Rustowi, że wszystkie typy, które mają rozmiar impl Trait
, muszą być zwymiarowane i czy istnieje definicja metody, która powinna działać dla nich wszystkich?
Zobacz również [Konwersja obiektu Rust Trait] (http://stackoverflow.com/q/41604107/155423) – Shepmaster