Bos*_*osh 2 traits matching rust trait-objects
我有一些代码尝试运行匹配,其中每个分支都可以返回不同的类型,但所有这些类型都实现了Iterator<Item=usize>.
let found: Iterator<Item = usize> = match requirements {
Requirements::A => MatchingAs { ainternals: [] },
Requirements::B => MatchingBs { binternals: [] },
Requirements::C => MatchingCs { cinternals: [] },
};
return found.any(|m| m == 1)
Run Code Online (Sandbox Code Playgroud)
... 哪里MatchingAs,MatchingBs, 以及MatchingCs所有impl std::iter::Iterator<Item = usize>。
我Iterator因为尺寸不合适而碰壁:
let found: Iterator<Item = usize> = match requirements {
Requirements::A => MatchingAs { ainternals: [] },
Requirements::B => MatchingBs { binternals: [] },
Requirements::C => MatchingCs { cinternals: [] },
};
return found.any(|m| m == 1)
Run Code Online (Sandbox Code Playgroud)
是否有一种好的方法可以让匹配臂返回具有共享特征的对象,然后(仅)依赖该特征来处理结果?
当你想返回一些不是的东西时,第一个反应Sized是Box它(也就是把它放在堆上,返回一个指针):
let found: Box<Iterator<Item = usize>> = match requirements {
Requirements::A => Box::new(MatchingAs { ainternals: [] }),
Requirements::B => Box::new(MatchingBs { binternals: [] }),
Requirements::C => Box::new(MatchingCs { cinternals: [] }),
};
found.any(|m| m == 1)
Run Code Online (Sandbox Code Playgroud)
这还不够,在这里,因为现在match会抱怨您返回不同的类型:Box<MatchingAs>, Box<MatchingBs>, ...
但是,只要有Box<Concrete>就可以强制转换Box<Trait>为impl Trait for Concrete,所以:
let found = match requirements {
Requirements::A => Box::new(MatchingAs { ainternals: [] }) as Box<Iterator<Item = usize>>,
Requirements::B => Box::new(MatchingBs { binternals: [] }) as Box<Iterator<Item = usize>>,
Requirements::C => Box::new(MatchingCs { cinternals: [] }) as Box<Iterator<Item = usize>>,
};
found.any(|m| m == 1)
Run Code Online (Sandbox Code Playgroud)
不过,有一个无需分配的解决方案:使用泛型。
fn search<T: Iterator<Item = usize>>(t: T) -> bool {
t.any(|m| m == 1)
}
Run Code Online (Sandbox Code Playgroud)
然后将该函数应用于 的每个分支match:
match requirements {
Requirements::A => search(MatchingAs {ainternals: []}),
Requirements::B => search(MatchingBs {binternals: []}),
Requirements::C => search(MatchingCs {cinternals: []}),
}
Run Code Online (Sandbox Code Playgroud)
权衡是它更接近回调地狱,有点间接的流程。
| 归档时间: |
|
| 查看次数: |
621 次 |
| 最近记录: |