我很难理解装箱特质的值是如何产生的。考虑以下代码:
trait Fooer {
fn foo(&self);
}
impl Fooer for i32 {
fn foo(&self) { println!("Fooer on i32!"); }
}
fn main() {
let a = Box::new(32); // works, creates a Box<i32>
let b = Box::<i32>::new(32); // works, creates a Box<i32>
let c = Box::<dyn Fooer>::new(32); // doesn't work
let d: Box<dyn Fooer> = Box::new(32); // works, creates a Box<Fooer>
let e: Box<dyn Fooer> = Box::<i32>::new(32); // works, creates a Box<Fooer>
}
显然,变量a和b可以轻松地工作。然而,变量c不行,可能是因为new函数只接受相同类型的值,而这种情况并不适用于Fooer != i32。变量d和e有效,这让我怀疑是否执行了某种自动转换,从Box到Box。
所以我的问题是:
Box<Fooer>
。我认为你不太理解 Rust 中的 trait 是如何工作的。尝试在每个变量(a..e
)上调用.foo()
,看看会发生什么。 - hellowc
无法工作的确切原因:the method 'new' exists but the following trait bounds were not satisfied: 'Fooer : std::marker::Sized'
。 - hellowBox::<Fooer>::new
,因为给定的类型参数必须在编译时具有已知大小,而这并不是Fooer
的情况,对吧?所以我的假设是正确的,你必须先构造一个具有大小的类型的 Box,然后以某种方式将其转换为 trait 类型的 Box,这让我想到了我的最初问题:这种转换是通过什么机制进行的? - AskagaBox<T>
是变体的,我可以将Box<Box<i32>>
强制转换为Box<Box<Fooer>>
。另一方面,将Box<Box<&'a i32>>
强制转换为Box<Box<&'b Fooer>>
是可能的,其中'a:'b
,因为'a:'b
是一个实际的子类型关系,而不像i32:Fooer
和不可变借用&'x T
不仅是变体的,而且还涵盖了'x
。 - Calculator