< 返回版块

ziyouwa 发表于 2022-09-01 10:15

Tags:flat_map, range

在官方文档的for_each中有这么个例子:

let a = (0..5).flat_map(|x| x * 100 .. x * 110).collect::<Vec<_>>();

println!("a: {a}");

// 以上的输出是
// a: [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213 ... 437, 438, 439]

现在是没搞明白闭包里面这个range的用法,有知道的大神麻烦帮忙解惑,谢谢。

评论区

写评论
苦瓜小仔 2022-09-01 14:37

Range<i32> 类型按照下面的方式生成迭代器:

if self.start < self.end {
    ...
    Some(...)
} else {
    None
}

所以 0..0 每次生成 None, a..b 生成 a, a+1, ..., b-1

当然,.flat_map(...).map(...).flatten() 等价,所以你的代码还可以写成 (0..5).map(|x| x * 100 .. x * 110).flatten().collect::<Vec<_>>()

作者 ziyouwa 2022-09-01 10:37

帖子发出去之后继续研究了一下,大致明白了,写出来备忘,如果不对,请指正。

(0..5) (x * 100 .. x * 110 ) 结果
第一次 0 ()或者不返回?
第二次 1 100~110 100~109
第三次 2 200~220 200~219
第四次 3 300~330 300~329
第五次 4 400~440 400~439
1 共 2 条评论, 1 页