16

如何生成包含 Rust 中所有整数的列表?我正在寻找与 Haskell[n..m]或 Python相当的range(n, m+1)东西,但找不到任何东西。

我知道这个int::range函数,并认为它是我正在寻找的,但它是在一个范围内迭代,而不是产生它。

4

4 回答 4

15

现在可以..=在 Rust 中使用:

let vec: Vec<_> = (n ..= m).collect();

为您提供Vec从 到 的所有n数字m

..=是包含范围运算符,而是..排除的。

于 2016-05-18T21:37:03.430 回答
10

请注意,此答案适用于 1.0 之前的 Rust 版本,不适用于 1.0。具体来说,Vec::from_fn被删除了。

到目前为止,可能没有什么真正地道的东西。有一些方便的函数来构造向量,例如你可以使用Vec::from_fn

Vec::from_fn(m+1-n, |i| i+n)
于 2013-04-06T21:27:52.740 回答
8

请注意,此答案适用于 1.0 之前的 Rust 版本,不适用于 1.0。具体来说,std::iter::range并被std::iter::range_inclusive删除。

从 Rust 1.0.0-alpha 开始,实现这一点的最简单方法是使用模块中提供的便利函数std::iter:rangerange_inclusive,它返回生成范围为 [low, high) 或 [low, high] 的数字列表的迭代器, 分别。

此外,您可以使用以下collect方法从迭代器构建向量:

use std::iter::range_inclusive;
let first_hundred: Vec<i32> = range_inclusive(1, 100).collect();
println!("upper bound inclusive: {:?}, exclusive: {:?}",
         first_hundred,
         range(101, 201).collect::<Vec<_>>());

请注意, 的返回值collect在上面的两种用法中都明确指定了其类型。通常,Rust 编译器可以在没有明确说明的情况下推断表达式的类型,但这collect是无法完全推断类型的最常见情况之一,在这种情况下,因为它无法推断出实现 trait 的具体类型FromIterator<A>,的返回类型collect

泛型返回值的类型可以指定为let定义语句中的显式类型,也可以使用function::<Type>()语法指定为内联类型。由于推理失败只是因为不知道实现的具体类型FromIterator<A>,所以在显式指定泛型类型时,可能会为将被推断的类型参数留下“漏洞”,由 . 表示_。这是通过对collect上面的第二次调用完成的——在表达式Vec<_>中,它明确指定从容器接收元素collect是 a Vec<T>,但编译器会确定确切的类型T必须是什么。目前,未指定类型且无法推断i32的整数默认回退到(32 位机器整数)。

于 2014-01-03T07:11:08.067 回答
6

从 Rust 1.26.0 开始,您可以使用RangeToInclusive( ..=) 运算符生成包含范围。

let v: Vec<_> = (n..=m).collect()
于 2019-01-19T14:51:26.090 回答