【发布时间】:2020-10-02 21:49:32
【问题描述】:
我一直在努力理解为什么以下代码的行为方式 (Playground):
use std::collections::HashMap;
trait Trait<'a> {
fn get_enum(&'a self) -> Enum<'a>;
}
#[derive(Clone)]
enum Enum<'a> {
Arr(Vec<&'a dyn Trait<'a>>),
Map(HashMap<String, &'a dyn Trait<'a>>)
}
impl<'a> Trait<'a> for Enum<'a> {
fn get_enum(&'a self) -> Enum<'a> {
self.clone()
}
}
fn process<'a>(val: &'a dyn Trait<'a>) -> Vec<&'a dyn Trait<'a>> {
let mut traits: Vec<&dyn Trait> = vec![];
match val.get_enum() {
Enum::Arr(v) => {
for elem in v {
traits.push(elem);
}
},
Enum::Map(m) => {
for elem in m.values() {
traits.push(elem);
}
}
}
traits
}
这会引发错误:
error[E0277]: the trait bound `&dyn Trait<'_>: Trait<'_>` is not satisfied
--> src/main.rs:29:29
|
29 | traits.push(elem);
| ^^^^ the trait `Trait<'_>` is not implemented for `&dyn Trait<'_>`
|
= note: required for the cast to the object type `dyn Trait<'_>`
对我来说奇怪的不是错误,而是错误只显示来自HashMap 而不是来自Vec 的迭代器的列表值。谁能给我解释一下:
- 为什么这两个结构的迭代器行为如此不同
- 如何将值从我的地图传递到我的数组中
我发现通过get 调用检索任何值时也会出现同样的现象。
【问题讨论】:
-
for elem in m.values()通过引用获取m并迭代引用。for elem in v按值获取v并迭代值。如果你写for elem in &v都失败,如果你写for (_, elem) in m都通过。 -
@trentcl 让这个答案怎么样?
-
我主要是想找到某种调用
get的方法来推入向量。我也理解迭代器的区别,但很难理解它们对 trait 对象的影响。
标签: rust traits trait-objects