【发布时间】:2021-06-15 11:22:38
【问题描述】:
我想要一个带有两个参数的函数,这两个参数都可以变成Foo 的迭代器。问题是我想接受IntoIterator<Foo> 和IntoIterator<&Foo> 的东西。重要的是Foo 是Copy,所以我可以从它的引用中廉价地创建一个拥有的副本。
我目前的解决方案是:
use std::borrow::Cow;
use std::iter::IntoIterator;
fn main() {
let foos = [Foo {}, Foo {}, Foo {}];
let references = || foos.iter();
let owned = || foos.iter().cloned();
bar(references(), references());
bar(references(), owned());
bar(owned(), references());
bar(owned(), owned());
}
#[derive(Copy, Clone)]
struct Foo {
// code ommitted here
}
impl<'a> From<Foo> for Cow<'a, Foo> {
fn from(foo: Foo) -> Self {
Self::Owned(foo)
}
}
impl<'a> From<&'a Foo> for Cow<'a, Foo> {
fn from(foo: &'a Foo) -> Self {
Self::Borrowed(foo)
}
}
fn bar<'a, AIter, A, BIter, B>(alpha_iter: AIter, beta_iter: BIter)
where
AIter: IntoIterator<Item=A>,
A: Into<Cow<'a, Foo>>,
BIter: IntoIterator<Item=B>,
B: Into<Cow<'a, Foo>>
{
for (alpha, beta) in alpha_iter.into_iter().zip(beta_iter.into_iter()) {
some_foo_specific_thing(*alpha.into(), *beta.into());
}
}
fn some_foo_specific_thing(alpha: Foo, beta: Foo) {
// code ommitted here
}
有没有办法在更少的行/没有Cow 的情况下做到这一点?
【问题讨论】:
标签: rust