我正在尝试创建一个函数,它将两个迭代器作为参数,并通过引用迭代项目。每个Iterator
项都应实现PartialEq
。
我的第一次尝试是:
fn compute<T: Iterator>(first: T, second: T, len: usize) -> usize
where
T::Item: std::cmp::PartialEq,
{
// ...
}
这编译但是迭代(据我所知)不是通过引用而是通过值,并且编译器在迭代时抱怨移动。
我的第二次尝试是这样的:
fn compute<'a, T>(first: T, second: T, len: usize) -> usize
where
T: Iterator<Item = &'a std::cmp::PartialEq>,
{
//...
}
导致编译器错误:
error[E0393]: the type parameter `Rhs` must be explicitly specified
--> src/main.rs:3:28
|
3 | T: Iterator<Item = &'a std::cmp::PartialEq>,
| ^^^^^^^^^^^^^^^^^^^ missing reference to `Rhs`
|
= note: because of the default `Self` reference, type parameters must be specified on object types
编译器在这里引用的Rhs
(右侧?)是什么意思?为什么我需要参考它?如何将基于参考的有界Iterator
传递给函数?
答案 0 :(得分:4)
PartialEq
是一个特性,可以让你比较两个值。这两个值 not 必须属于同一类型! 泛型类型 Rhs
用于指定我们要比较的类型。默认情况下,Rhs
的值与要与之比较的类型相同:
pub trait PartialEq<Rhs = Self>
where
Rhs: ?Sized,
在这种情况下,您实际上是在请求迭代器值为特征对象 &PartialEq
。如错误消息所示:
由于默认的
上指定类型参数Self
引用,必须在对象类型
我们可以指定它:
fn compute<'a, T>(first: T, second: T, len: usize) -> usize
where
T: Iterator<Item = &'a std::cmp::PartialEq<i32>>,
或
fn compute<'a, T: 'a>(first: T, second: T, len: usize) -> usize
where
T: Iterator<Item = &'a std::cmp::PartialEq<&'a T>>,
但迭代(据我所知)不是通过引用而是通过值
它很可能通过引用进行迭代。请注意,T
是任何类型,i32
,&i32
和&mut i32
是所有类型。你的第一个例子是我将使用的签名的制定:
fn compute<T: Iterator>(first: T, second: T, len: usize) -> usize
where
T::Item: std::cmp::PartialEq,
{
42
}
fn main() {
let a = [1, 2, 3];
let b = [4, 5, 6];
compute(a.iter(), b.iter(), 1);
compute(a.iter(), b.iter(), 2);
compute(a.iter(), b.iter(), 3);
}