我正在尝试创建一个函数,该函数将两个迭代器作为参数并通过引用迭代这些项目。每个Iterator项目都应该实现PartialEq.
我的第一次尝试是:
fn compute<T: Iterator>(first: T, second: T, len: usize) -> usize
where
T::Item: std::cmp::PartialEq,
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
这编译但迭代(据我所知)不是通过引用而是通过值,并且编译器在迭代时抱怨移动。
我的第二次尝试是这样的:
fn compute<'a, T>(first: T, second: T, len: usize) -> usize
where
T: Iterator<Item = &'a std::cmp::PartialEq>,
{
//...
}
Run Code Online (Sandbox Code Playgroud)
导致编译器错误:
fn compute<T: Iterator>(first: T, second: T, len: usize) -> usize
where
T::Item: std::cmp::PartialEq,
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
Rhs编译器在这里指的(右侧?)是什么意思?为什么我需要引用它?如何将基于有界引用Iterator的函数传递给函数?
PartialEq是一种特性,允许您比较两个值。这两个值都没有必须是同一类型的!该泛型类型 Rhs是用来指定何种类型,我们用比较。默认情况下,的值与Rhs正在比较的类型相同:
pub trait PartialEq<Rhs = Self>
where
Rhs: ?Sized,
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您实际上是在请求迭代器值是 特征对象 &PartialEq。正如错误消息所述:
由于默认
Self引用,必须在对象类型上指定类型参数
我们可以指定它:
fn compute<'a, T>(first: T, second: T, len: usize) -> usize
where
T: Iterator<Item = &'a std::cmp::PartialEq<i32>>,
Run Code Online (Sandbox Code Playgroud)
或者
fn compute<'a, T: 'a>(first: T, second: T, len: usize) -> usize
where
T: Iterator<Item = &'a std::cmp::PartialEq<&'a T>>,
Run Code Online (Sandbox Code Playgroud)
但迭代(据我所知)不是通过引用而是通过价值
它很有可能通过引用进行迭代。请记住,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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
685 次 |
| 最近记录: |