如何生成包含Rust中所有整数的列表?我正在寻找相当于Haskell的[n..m]
或Python的range(n, m+1)
,但找不到任何东西。
我知道int::range
函数并且认为它是我正在寻找的,但它是在一个范围内迭代,而不是生成它。
答案 0 :(得分:14)
现在可以在Rust中使用..
:
let vec: Vec<_> = (n .. m + 1).collect();
从Vec
到n
的所有数字中为您提供m
。
如Shepmaster的评论中所述,请注意,如果您需要的范围最高为该类型的最大值(255
的{{1}}),则无效。
答案 1 :(得分:10)
注意这个答案适用于1.0之前版本的Rust,不适用于1.0。具体而言,
Vec::from_fn
已被删除。
现在可能没有什么真正的惯用语。构造向量有一些便利函数,例如,您可以使用Vec::from_fn
:
Vec::from_fn(m+1-n, |i| i+n)
答案 2 :(得分:8)
注意这个答案适用于1.0之前版本的Rust,不适用于1.0。具体而言,
std::iter::range
和std::iter::range_inclusive
已被删除。
从Rust 1.0.0-alpha开始,最简单的方法是使用模块std::iter
中提供的便捷函数:range
和range_inclusive
,它们返回迭代器生成分别在[低,高]或[低,高]范围内的数字列表。
此外,您可以使用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
是无法完全推断出类型的最常见情况之一,在这种情况下,因为它无法推断具体类型实现特征FromIterator<A>
,返回类型为collect
。
泛型返回值的类型可以在let
定义语句中指定为显式类型,也可以使用function::<Type>()
语法指定内联。由于推理仅由于不知道实现FromIterator<A>
的具体类型而失败,因此在明确指定泛型类型时,可以为将被推断的类型参数留下“漏洞”,由_
表示。这是通过在表达式collect
中对Vec<_>
进行第二次调用来完成的,它明确指出从collect
接收元素的容器是Vec<T>
,但编译器数字确切的类型T
必须是什么。目前,其类型未指定且无法推断的整数可以回退到i32
(32位机器整数)作为默认值。
答案 3 :(得分:3)
从Rust 1.26.0开始,您可以使用RangeToInclusive
(..=
)运算符来生成包含范围。
let v: Vec<_> = (n..=m).collect()