我们可以用std::any::Any将不同的类型聚集成Box.

use std::any::Any;

fn foo(value: Box<dyn Any>) {
    if let Some(string) = value.downcast_ref::<String>() {
        println!("String: {}", *string);
    } else if let Some(int) = value.downcast_ref::<i32>() {
        println!("i32: {}", *int);
    }
}

fn main() {
    let x = Box::new("hello".to_owned());
    let y = Box::new(123);
    foo(x);
    foo(y);
}

我们还可以使用downcast来标识Box中的值的类型.我了解到C++中的类型可以由虚函数来确定,根据这个问题,How does RTTI work?.然而,像i32这样的类型也可以在铁 rust 中被降级.它怎麽工作?

推荐答案

当你在这里做let y = Box::new(123)时,y被推断为Box<dyn Any>,not Box<i32>.这本质上等同于编写let y = Box::new(123) as Box<dyn Any>,这可能会使正在发生的事情变得更加明显:在构造它时向上强制转换框以添加i32的typeid,以便以后可以向下转换它.

Rust相关问答推荐

通用池类型xsx

下载压缩文件

如何将`Join_all``Vec<;Result<;Vec<;Foo&>;,Anywhere::Error&>;`合并到`Result<;Vec<;Foo&>;,Anywhere::Error&>;`

定义采用更高级类型泛型的性状

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

如何高效地将 struct 向量中的字段收集到单独的数组中

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

关于 map 闭合求和的问题

在macro_rule中拆分模块和函数名

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

提取指向特征函数的原始指针

为什么这个闭包没有实现Fn?

Rust 为什么被视为borrow ?

如何在 Rust 中将 Vec> 转换为 Vec>?

在 Rust 中使用 `SecTrustSettingsSetTrustSettings` 绑定导致 `errSecInternalComponent`

Rust 函数指针似乎被borrow 判断器视为有状态的

为什么在 rust 中删除 vec 之前应该删除元素

为什么拥有 i32 所有权的函数需要它是可变的?

如何断言代码不会在测试中编译?

返回引用的返回函数