У меня есть следующий кодКак вы создаете ящик <T>, когда T - объект-признак?
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() {}
Он жалуется, что
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`
Я не понимаю, почему он требует Sized
на Rng
когда Box<T>
не навязывает это на T
.
На самом деле это не имеет никакого отношения, с тем фактом, что вы позже храните это в члене, чтобы название было довольно неточным и не помогло дальнейшим искателям. Если у кого-то есть идея для лучшей идеи ... –
Знаете ли вы о [объектах trait] (https://doc.rust-lang.org/book/trait-objects.html)? – kennytm
@ MatthieuM. Вы правы, что титул нуждается в улучшении. – Andreas