可选择取消引用对 Copy 对象的引用的特征?

问题描述 投票:0回答:1

我正在实现一个按值获取元素列表的函数,但我需要对列表执行两次传递。第一遍计算输入数据的一些值(不修改输入数据),第二遍消耗输入数据。

本质上是这样的:

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 中做这样的事情?

rust iterator traits ref
1个回答
1
投票

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.