У меня есть черта, в которой я хочу предоставить метод. Этот метод должен быть реализован в терминах некоторых помощников, которые не имеют бизнеса внутри черты и достаточно нетривиальны, что динамический полиморфизм имеет больше смысла, чем их общий характер. Поэтому у меня есть код вдоль линийПредоставленный метод casting & self to trait object
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 там особенно потому, что черта иначе всегда обрабатываются как признак объект.
Есть ли способ рассказать Ржавчине, что все типы, которые должны иметь размер impl Trait
, и вот определение метода, который должен работать для всех из них?
См. Также [Преобразование объекта Rust Trait] (http://stackoverflow.com/q/41604107/155423) – Shepmaster