gpt4 book ai didi

rust - Vec 是如何实现 iter() 的?

转载 作者:行者123 更新时间:2023-11-29 07:44:30 25 4
gpt4 key购买 nike

我正在查看 Vec<T> 的代码看看它是如何实现的 iter()因为我想为我的结构实现迭代器:

pub struct Column<T> {
name: String,
vec: Vec<T>,
...
}

我的目标不是公开字段并提供迭代器来为列执行循环、最大值、最小值、总和、平均值等。

fn test() {
let col: Column<f32> = ...;
let max = col.iter().max();
}

我想我会看看如何Vec<T>做迭代。我可以看到 iter()SliceExt 中定义但它是为 [T] 实现的而不是 Vec<T>所以我很难过你怎么调用iter()来自 Vec<T>

最佳答案

事实上,正如 fjh 所说,这是由于 Rust 中取消引用运算符的功能以及方法的解析方式而发生的。

Rust 有特殊的 Deref 允许实现它的类型的值被“取消引用”以获得另一种类型的特征,通常是自然连接到源类型的类型。例如,像这样的实现:

impl<T> Deref for Vec<T> {
type Target = [T];

fn deref<'a>(&'a self) -> &'a [T] { self.as_slice() }
}

表示应用 *一元运算符到 Vec<T>会产生 [T]您需要再次借用:

let v: Vec<u32> = vec![0; 10];
let s: &[u32] = &*v;

(请注意,即使 deref() 返回引用,取消引用运算符 * 返回 Target,而不是 &Target - 如果您不立即借用取消引用的值,编译器会插入自动取消引用)。

这是第一 block 拼图。第二个是方法是如何解决的。基本上,当你写类似的东西时

v.iter()

编译器首先尝试查找 iter()v 的类型上定义(在本例中为 Vec<u32> )。如果找不到这样的方法,编译器会尝试插入适当数量的 * s 和 & s 这样方法调用就有效了。在这种情况下,它发现以下确实是一个有效的调用:

(&*v).iter()

记住,DerefVec<T>返回 &[T] , 切片确实有 iter()在他们身上定义的方法。这也是您可以调用的方式,例如采取 &self 的方法在常规值上 - 编译器会自动为您插入引用操作。

关于rust - Vec<T> 是如何实现 iter() 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29166437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com