我正在实现一个按值获取元素列表的函数,但我需要对列表执行两次传递。第一遍计算输入数据的一些值(不修改输入数据),第二遍消耗输入数据。
本质上是这样的:
fn make_from_elements<K, V, C>(elements: C) -> Container<K, V>
where
K: Copy + Ord,
C: IntoIterator<Item = (K, V)>,
for<'a> &'a C: IntoIterator<Item = (&'a K, &'a V)>,
{
let max_key = (&elements).into_iter().map(|(k, v)| *k).max().unwrap();
make_container(max_key, elements)
}
但是,上面的代码假设
(&elements).into_iter().map(|(k, v)| k)
是一个项目类型为 &K
的迭代器。对于我拥有的一些特殊容器来说,情况并非总是如此;有时,上面的表达式是一个项目类型为 K
的迭代器(不带引用)。是否有一个特征包装了实现 Copy
的可能引用的对象?
换句话说,我正在尝试找到应该像这样工作的东西:
fn make_from_elements<K, V, C, Q>(elements: C) -> Container<K, V>
where
K: Copy + Ord,
C: IntoIterator<Item = (K, V)>,
for<'a> &'a C: IntoIterator<Item = (Q + 'a, &'a V)>,
Q: MaybeDerefCopy<K>,
{
let max_key = (&elements).into_iter().map(|(k, v)| k.maybe_deref_copy()).max().unwrap();
make_container(max_key, elements)
}
我怎样才能在 Rust 中做这样的事情?
Borrow
特质应该在这里起作用,因为T
和&T
都实现了Borrow<T>
。
fn make_from_elements<KR, K, V, C>(elements: C) -> Container<K, V>
where
K: Copy + Ord,
KR: Borrow<K>,
C: IntoIterator<Item = (KR, V)>,
for<'a> &'a C: IntoIterator<Item = (&'a KR, &'a V)>,
{
let max_key = (&elements).into_iter().map(|(k, v)| *k.borrow()).max().unwrap();
make_container(max_key, elements)
}