考虑下面的Rust代码:
为什么前两个对`rbdt`的赋值能正确地将值强制转换为目标类型(`Result, ()>`),但第三个却不行呢?在我看来,这三种情况下赋值右侧的类型都是`Result, ()>`,所以令人困惑的是为什么有些形式能正常工作,而其他形式会导致类型不匹配的错误。
关于包含特质对象的类型何时可以进行赋值,有哪些规则?这些规则是否有文档记录?
#[derive(Debug, Clone, Copy)]
struct Struct;
trait Trait {}
impl Trait for Struct {}
fn f() {
// Why does this coerce to the target type (Result<Box<dyn Trait>, ()>)
let rbdt: Result<Box<dyn Trait>, ()> = Ok(Box::new(Struct));
// And this coerces to the target type...
let a = Box::new(Struct);
let rbdt: Result<Box<dyn Trait>, ()> = Ok(a);
// But this does not:
let a = Ok(Box::new(Struct));
let rbdt: Result<Box<dyn Trait>, ()> = a; // Error: mismatched types
}
为什么前两个对`rbdt`的赋值能正确地将值强制转换为目标类型(`Result, ()>`),但第三个却不行呢?在我看来,这三种情况下赋值右侧的类型都是`Result, ()>`,所以令人困惑的是为什么有些形式能正常工作,而其他形式会导致类型不匹配的错误。
关于包含特质对象的类型何时可以进行赋值,有哪些规则?这些规则是否有文档记录?