我正在重写一些代码,用于将参数应用到参数化字符串中。它基本上涉及到使用一个以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,仍然没有。
我试过很多方法。
1条答案
按热度按时间e4yzc0pl1#
尝试使用
Any::downcast_ref
而不是Any::downcast
,以避免移出散列表条目的值:Playground.