gpt4 book ai didi

iterator - 为什么 Iterator::next 返回一个选项而不是一个项目?

转载 作者:行者123 更新时间:2023-11-29 08:10:29 26 4
gpt4 key购买 nike

在我看来,一个选项是否是正确的返回类型应该取决于实现者。

我注意到,当我尝试对项目进行过滤或使用其他收集方法时,它会消失。这只是 has_next 的替代品吗?它不会对性能/内存产生潜在影响吗?

最佳答案

因为它需要某种方式来与调用者沟通,即没有任何内容可输出。

fn main() {
let mut it = vec![1, 2, 3].into_iter();
assert_eq!(it.next(), Some(1));
assert_eq!(it.next(), Some(2));
assert_eq!(it.next(), Some(3));
assert_eq!(it.next(), None); // End of iterator.
}

至于假设的 has_next,这可能会使某些迭代器设计复杂化,因为它需要迭代器知道是否有另一个元素。这可能需要迭代器计算下一个元素,然后将其存储在某处。也有可能忘记调用 has_next,或者调用它但忽略结果。

随着 next 返回一个 Option,这些都不是问题;迭代器可以计算下一项并将其返回,同时使调用者不可能忘记确保返回值中确实包含某些内容。

不能让你做的一件事是“窥视”迭代器以查看是否还有其他内容,然后根据该答案更改逻辑,没有实际消耗下一项。然而,这就是 peekable 组合器的用途,它为您提供相当于传统 has_next 的内容:peek().is_some()

关于您对性能的担忧:我从未见过任何迹象表明存在任何惩罚。任何正确使用迭代器的东西都必须检查它是否到达终点。至于空间,Rust 迭代器不需要缓存下一项,因此它们可能与使用 has_next 的语言的迭代器大小相同或更小。

最后,如评论中所述,Option 未分配堆。 None 相当于 false 后跟一些未初始化的空间(因为里面什么都没有),而 Some(v) 相当于true 后跟 v

关于iterator - 为什么 Iterator::next 返回一个选项而不是一个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50528645/

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