首先官方文档描述为,返回当前迭代器未迭代元素数量的上下界。
首先这个定义就很迷惑,什么叫未迭代元素数量的上下界。。未迭代元素数量不应该是确定的一个值吗 <即使是一个类似于 (let x = (0..); 的无限迭代器,也应该是一个确定的值‘infinite’或者 None 吧?>
回到文档,具体实现是返回一个 tuple (usize, Option<usize>) ,左边表示下界,右边表示上界。
然后再看下官方给的例子:
一个基础样例: let a = [1, 2, 3]; let iter = a.iter();
assert_eq!((3, Some(3)), iter.size_hint());
从这段代码来看,由于 iter 的 next 未被调用,所以 iter 的未迭代元素数量是 3
然后看一下 size_hint 的返回值,(3, Some(3))是什么意思,是一种来自编译器的‘推测’吗?我的理解是,编译器推测出‘未迭代元素数量的最小值’为 3,因为我们已经确定了 iter 甚至并未开始工作;然后编译器推测出‘未迭代元素数量的最大值’也为 3,这我也能理解。
一个复杂点的样例:
// 过滤出 0..10 中的偶数.则 iter 的内容应该是(0, 2, 4, 6, 8)
let iter = (0..10).filter(|x| x % 2 == 0);
// 凭什么??这个 0 和 10 代表什么?按我的理解还有 5 个元素未迭代,怎么会有个 10 呢。。
assert_eq!((0, Some(10)), iter.size_hint());
// 用 chain 适配器在之后接上五个值,那么应该为(0 2 4 6 8 15 16 17 18 19)
let iter = (0..10).filter(|x| x % 2 == 0).chain(15..20);
// 为什么上下界同时加 5 ??这里 5 和 15 又代表什么呢??
assert_eq!((5, Some(15)), iter.size_hint());
实在太困惑了,看了一个多小时愣是没看懂。如果这个方法真的是一种‘推测’功能,它是凭什么来推测的呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.