对What is the difference between &Trait and impl Trait when used as method arguments?的答复指出:
如果您的对象的实际类型只有在运行时才知道,这是您唯一可以使用的版本,因为您需要使用动态调度。
在编译时,您什么时候不知道类型?当Rust编译器检查一个类型是否符合&T1的特性时,难道它也不知道它的具体类型吗?
发布于 2020-11-09 21:52:55
下面是一个例子:
use rand::{thread_rng, Rng};
struct ConcreteA { }
struct ConcreteB { }
trait Trait { }
impl Trait for ConcreteA { }
impl Trait for ConcreteB { }
fn main() {
// a runtime value
let cond: bool = thread_rng().gen();
let a = ConcreteA { };
let b = ConcreteB { };
let r: &dyn Trait = if cond { &a } else { &b };
}r所指的具体类型是什么?
特性约束由编译器在创建&dyn Trait的点进行检查,因为它必须引用具体的类型。代码的其余部分可以在不知道具体类型的情况下通过使用动态分派来使用引用。所以编译器总是知道它指的是具体类型,但不一定是哪种类型。
https://stackoverflow.com/questions/64759504
复制相似问题