Types 什么时候只有在运行时才知道类型?

Types 什么时候只有在运行时才知道类型?,types,rust,traits,Types,Rust,Traits,对各国的答复: 如果对象的实际类型仅在运行时才为人所知,那么这是您可以使用的唯一版本,因为您需要使用动态分派 在编译时您什么时候不知道类型?当Rust编译器检查一个类型是否符合&T1的特征时,它不知道它的具体类型吗?下面是一个示例: use rand::{thread_rng, Rng}; struct ConcreteA { } struct ConcreteB { } trait Trait { } impl Trait for ConcreteA { } impl Trait for

对各国的答复:

如果对象的实际类型仅在运行时才为人所知,那么这是您可以使用的唯一版本,因为您需要使用动态分派

在编译时您什么时候不知道类型?当Rust编译器检查一个类型是否符合
&T1
的特征时,它不知道它的具体类型吗?

下面是一个示例:

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
的位置检查Trait约束,因为它必须引用具体类型。通过使用动态分派,代码的其余部分可以在不知道具体类型的情况下使用引用。因此编译器总是知道它引用的是具体类型,但不一定是哪一种类型。

下面是一个示例:

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
的位置检查Trait约束,因为它必须引用具体类型。通过使用动态分派,代码的其余部分可以在不知道具体类型的情况下使用引用。所以编译器总是知道它引用的是一个具体类型,但不一定是哪一个。

什么是
r
引用的具体类型-
r
的具体类型是
&dyn Trait
@Shepmaster是的,但我在反问它引用的是什么具体类型。如果有更好的表达方式,欢迎您编辑。谢谢,现在它有意义了。
r
所指的具体类型是什么?
r
的具体类型是
&dyn Trait
@Shepmaster是的,但我在反问它所指的具体类型是什么。如果有更好的表达方式,欢迎你来编辑。谢谢,现在有意义了。