我们可以使用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);
}
Run Code Online (Sandbox Code Playgroud)
我们还可以用来downcast
识别 a 中值的类型Box
。我了解到C++中的类型可以通过虚函数来确定,根据这个问题,RTTI是如何工作的?。然而,类似的类型i32
在 Rust 中也可以被向下转型。它是如何工作的?
当你let y = Box::new(123)
在这里这样做时,y
被推断为是Box<dyn Any>
,而不是 Box<i32>
。这本质上等同于编写let y = Box::new(123) as Box<dyn Any>
,这可能会让发生的事情更加明显:您在构造它时将盒子向上转换以添加 typeid ,i32
以便稍后可以将其向下转换回来。
归档时间: |
|
查看次数: |
110 次 |
最近记录: |