我想创建一个结构向量,每个结构都包含一个可以具有任何(多个)类型的字段,也能够提取这些值。我试过这个:
use std::any::Any;
fn main() {
let mut v: Vec<Box<dyn Any>> = Vec::new();
v.push(Box::new("test"));
v.push(Box::new(3i32));
let string: &Box<&str> = &v[0].downcast_ref().unwrap(); // erroneous line
println!("{}", string);
let int: &Box<&i32> = &v[1].downcast_ref().unwrap(); // probably gives an error too
println!("{}", int);
}
Run Code Online (Sandbox Code Playgroud)
它应该打印出来
use std::any::Any;
fn main() {
let mut v: Vec<Box<dyn Any>> = Vec::new();
v.push(Box::new("test"));
v.push(Box::new(3i32));
let string: &Box<&str> = &v[0].downcast_ref().unwrap(); // erroneous line
println!("{}", string);
let int: &Box<&i32> = &v[1].downcast_ref().unwrap(); // probably gives an error too
println!("{}", int);
}
Run Code Online (Sandbox Code Playgroud)
相反,它恐慌:
test
3
Run Code Online (Sandbox Code Playgroud)
据我了解,它向下转换为&str并解包为 give &Box<&str>,除了它返回一个None值。
我尝试过其他东西,例如带有泛型的结构,但仅限于一种类型:
struct Item<T> {
item: T,
}
fn main() {
let mut v: Vec<Item<&str>> = Vec::new();
v.push(Item { item: "hi" });
v.push(Item { item: 3i32 }); // error because it can only be &str, not i32
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
你不抱Box<&str>在Any。你抱&str在Any。
let string: &str = v[0]
.downcast_ref::<&str>()
.unwrap();
println!("{}", string);
let int: &i32 = v[1]
.downcast_ref() // Rust infers ::<i32>
.unwrap();
println!("{}", int);
Run Code Online (Sandbox Code Playgroud)