为什么将&str存储在Box<dynAny>并将其向下转换为&Box<&str>总是导致None?

我想创建一个结构向量,每个结构都包含一个可以具有任何(多个)类型的字段,也能够提取这些值。我试过这个:

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);
}

它应该打印出来

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);
}

相反,它恐慌:

test
3

据我了解,它向下转换为&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
}

我该怎么做?

回答

你不抱Box<&str>Any。你抱&strAny

let string: &str = v[0]
    .downcast_ref::<&str>()
    .unwrap();

println!("{}", string);

let int: &i32 = v[1]
    .downcast_ref()  // Rust infers ::<i32>
    .unwrap();

println!("{}", int);


以上是为什么将&amp;str存储在Box&lt;dynAny&gt;并将其向下转换为&amp;Box&lt;&amp;str&gt;总是导致None?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>