Ich habe den folgenden CodeWie erstellen Sie eine Box <T>, wenn T ein Objekt ist?
extern crate rand;
use rand::Rng;
pub struct Randomizer {
rand: Box<Rng>,
}
impl Randomizer {
fn new() -> Self {
let mut r = Box::new(rand::thread_rng()); // works
let mut cr = Randomizer { rand: r };
cr
}
fn with_rng(rng: &Rng) -> Self {
let mut r = Box::new(*rng); // doesn't work
let mut cr = Randomizer { rand: r };
cr
}
}
fn main() {}
Sie wirft
error[E0277]: the trait bound `rand::Rng: std::marker::Sized` is not satisfied
--> src/main.rs:16:21
|
16 | let mut r = Box::new(*rng);
| ^^^^^^^^ `rand::Rng` does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `rand::Rng`
= note: required by `<std::boxed::Box<T>>::new`
Ich verstehe nicht, warum es Sized
auf Rng
erfordert, wenn Box<T>
dies nicht auf T
verhängen.
Dies hat eigentlich keine Beziehung, whatsover, mit der Tatsache, dass Sie später dies in einem Mitglied speichern, so ist der Titel ziemlich ungenau und wird nicht weiter Suchern viel helfen. Wenn jemand eine Idee für eine bessere Idee hat ... –
Kennen Sie [Merkmalsobjekte] (https://doc.rust-lang.org/book/trait-objects.html)? – kennytm
@MatthieuM. Sie haben Recht, dass der Titel verbessert werden muss. – Andreas