如何生成包含 Rust 中所有整数的列表?我正在寻找与 Haskell[n..m]
或 Python相当的range(n, m+1)
东西,但找不到任何东西。
我知道这个int::range
函数,并认为它是我正在寻找的,但它是在一个范围内迭代,而不是产生它。
如何生成包含 Rust 中所有整数的列表?我正在寻找与 Haskell[n..m]
或 Python相当的range(n, m+1)
东西,但找不到任何东西。
我知道这个int::range
函数,并认为它是我正在寻找的,但它是在一个范围内迭代,而不是产生它。
现在可以..=
在 Rust 中使用:
let vec: Vec<_> = (n ..= m).collect();
为您提供Vec
从 到 的所有n
数字m
。
..=
是包含范围运算符,而是..
排除的。
请注意,此答案适用于 1.0 之前的 Rust 版本,不适用于 1.0。具体来说,
Vec::from_fn
被删除了。
到目前为止,可能没有什么真正地道的东西。有一些方便的函数来构造向量,例如你可以使用Vec::from_fn
:
Vec::from_fn(m+1-n, |i| i+n)
请注意,此答案适用于 1.0 之前的 Rust 版本,不适用于 1.0。具体来说,
std::iter::range
并被std::iter::range_inclusive
删除。
从 Rust 1.0.0-alpha 开始,实现这一点的最简单方法是使用模块中提供的便利函数std::iter
:range
和range_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 位机器整数)。
从 Rust 1.26.0 开始,您可以使用RangeToInclusive
( ..=
) 运算符生成包含范围。
let v: Vec<_> = (n..=m).collect()