如何生成包含Rust中所有整数的列表?我正在寻找相当于Haskell [n..m]或Python的,range(n, m+1)但找不到任何东西.
我知道这个int::range功能,并认为这是我正在寻找的东西,但它是在一个范围内迭代,而不是产生它.
ant*_*oyo 14
现在可以..在Rust中使用:
let vec: Vec<_> = (n .. m + 1).collect();
Run Code Online (Sandbox Code Playgroud)
给你一个Vec从所有号码从n到m.
正如Shepmaster的评论中所指出的那样,要注意,如果你需要一个范围达到类型(255for u8)的最大值,它将无法工作.
ben*_*ben 10
请注意,此答案适用于Rust之前的1.0版本,不适用于1.0.具体来说,
Vec::from_fn被删除了.
到目前为止,可能没有什么真正的惯用语.构造向量有一些便利函数,例如你可以使用Vec::from_fn:
Vec::from_fn(m+1-n, |i| i+n)
Run Code Online (Sandbox Code Playgroud)
请注意,此答案适用于Rust之前的1.0版本,不适用于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<_>>());
Run Code Online (Sandbox Code Playgroud)
请注意,返回值的collect类型在上面的两个用法中都明确指定了.通常,Rust编译器可以在没有显式规范的情况下推断表达式的类型,但是collect这种类型无法完全推断的最常见情况之一,在这种情况下,因为它无法推断实现该特征的具体类型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()
Run Code Online (Sandbox Code Playgroud)