rust 从字符串Map到动态值,访问失败

bvk5enib  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(85)

我正在重写一些代码,用于将参数应用到参数化字符串中。它基本上涉及到使用一个以HashMap<String, Box<dyn Any>>形式给出的参数列表。

let map = applicable_string_map!{
    "a" => "foo",
    "b" => "bar",
};

这个宏将"foo""bar" Package 成Box<dyn Any>。它返回一个HashMap<String, Box<dyn Any>>
问题是我的Assert编译失败了,看起来我不能再索引HashMap了:

use std::{any::Any, collections::HashMap};

fn main() {
    let map = HashMap::<String, Box<dyn Any>>::new();
    assert_eq!(
        *((&map[&"a".to_owned()]).downcast::<&'static str>().unwrap()),
        "foo"
    );
    assert_eq!(
        *map[&"b".to_owned()].downcast::<&'static str>().unwrap(),
        "bar"
    );
    assert!(map.get(&"c".to_owned()).is_none());
}

为了简单起见,我尝试使用以下语句代替Assert:

let _v = map[&"a".to_owned()];

我得到这个VerifyError:
无法移出HashMap<String, Box<dyn Any>>的索引,因为值的类型为Box<dyn Any>,该类型不实现Copy
考虑借用以下内容:&map[&"a".to_owned()]
所以我在这行做了这个,它起作用了。但是对于Assert,仍然没有。
我试过很多方法。

e4yzc0pl

e4yzc0pl1#

尝试使用Any::downcast_ref而不是Any::downcast,以避免移出散列表条目的值:

#[test]
fn string_application() {
    let map = applicable_string_map!{
        "a" => "foo",
        "b" => "bar",
    };
    
    let _v: &Box<dyn Any> = &map["a"];
    
    assert_eq!(
        *map["a"].downcast_ref::<&'static str>().unwrap(),
        "foo"
    );
    
    assert_eq!(
        *map["b"].downcast_ref::<&'static str>().unwrap(),
        "bar"
    );
    
    assert!(map.get(&"c".to_owned()).is_none());
}

Playground.

相关问题