次のコードがそのように動作する理由を理解するのに苦労しています( 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
誰かが私に説明できますか:
- 2 つの構造体の反復子の動作が異なる理由
- マップから配列に値を渡す方法
get
呼び出しを介して値を取得しても同じ現象が発生することがわかりました。