我正在实现一个函数,它通过值获取一个元素列表,但是我需要对列表执行两次遍历。第一次遍历计算输入数据的值(不修改输入数据),第二次遍历消耗输入数据。
基本上,类似这样的东西:
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)
是一个iterator,它的项类型是&K
。对于我拥有的一些特殊容器,这并不总是正确的;有时,上面的表达式是一个iterator,它的项类型是K
(没有引用)。是否有一个trait Package 了实现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中做这样的事情呢?
1条答案
按热度按时间cetgtptt1#
Borrow
trait应该在这里工作,因为T
和&T
都实现了Borrow<T>
。字符串
你也可以通过要求
Clone
而不是Copy
来使你的函数支持更多的类型。Copy
类型的Clone
实现应该已经委托给一个简单的按位复制,无论如何都应该内联,所以对于Copy
类型的性能将不受影响。型