std::iter::iterator::size_hint 方法究竟实现了个什么功能头好晕

2020-09-22 17:17:42 +08:00
 0gre2019

首先官方文档描述为,返回当前迭代器未迭代元素数量的上下界。

首先这个定义就很迷惑,什么叫未迭代元素数量的上下界。。未迭代元素数量不应该是确定的一个值吗 <即使是一个类似于 (let x = (0..); 的无限迭代器,也应该是一个确定的值‘infinite’或者 None 吧?>

回到文档,具体实现是返回一个 tuple (usize, Option<usize>) ,左边表示下界,右边表示上界。

然后再看下官方给的例子:

从这段代码来看,由于 iter 的 next 未被调用,所以 iter 的未迭代元素数量是 3

然后看一下 size_hint 的返回值,(3, Some(3))是什么意思,是一种来自编译器的‘推测’吗?我的理解是,编译器推测出‘未迭代元素数量的最小值’为 3,因为我们已经确定了 iter 甚至并未开始工作;然后编译器推测出‘未迭代元素数量的最大值’也为 3,这我也能理解。

实在太困惑了,看了一个多小时愣是没看懂。如果这个方法真的是一种‘推测’功能,它是凭什么来推测的呢?

2727 次点击
所在节点    Rust
1 条回复
PTLin
2020-10-09 21:20:59 +08:00
这个 size_hint 就是为一些创建集合的函数提供一些基本信息,比如 FromIterator trait,这个信息也许可以辅助 from_iter 一类的方法在创建分配连续内存的时候可以直接分配个适当的大小。
至于为什么 filter,chain 的 size_hint 会是那些值其实直接看源码就行了,不是什么编译器预测的。。。
https://doc.rust-lang.org/src/core/iter/adapters/mod.rs.html#996
https://doc.rust-lang.org/src/core/iter/adapters/chain.rs.html#160

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/709496

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX