这个问题已经在这里有一个答案:
- 如何包括一系列终值? 2个回答
如何产生含铁锈的所有整数的列表? 我在寻找Haskell的等效[n..m]
或Python的range(n, m+1)
但无法找到任何东西。
我知道的int::range
功能,并认为这是我一直在寻找,但它是由迭代一个范围,而不是生产。
这个问题已经在这里有一个答案:
如何产生含铁锈的所有整数的列表? 我在寻找Haskell的等效[n..m]
或Python的range(n, m+1)
但无法找到任何东西。
我知道的int::range
功能,并认为这是我一直在寻找,但它是由迭代一个范围,而不是生产。
需要注意的是这个答案涉及到预先1.0版本锈的和不适用1.0。 具体而言,
std::iter::range
和std::iter::range_inclusive
除去。
作为防锈1.0.0-α,完成此过程的最简单的方法是使用在模块中提供的功能的便利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
了其类型明确上述两种它的使用规定。 通常情况下,防锈编译器可以推断类型的表达式没有明确的规范,但collect
是最常见的情况有类型不能完全推断出一个,在这种情况下,因为它不能推断,实现了性状的具体类型FromIterator<A>
,返回类型collect
。
的类型的通用的返回值可以被指定或者如在一个明确的类型let
通过使用定义语句或内联function::<Type>()
的语法。 由于推断失败只是由于不知道具体类型实现FromIterator<A>
,这是可能的,明确地指定一个泛型类型的时候,留下的“洞”的类型参数将被推断,通过标志着_
。 这是与第二呼叫完成于collect
上述表达式中的Vec<_>
它的显式指定,该容器接收来自元件collect
是Vec<T>
但是编译器将断定哪些确切类型T
必须。 目前,其整数类型未指定,不能推断回落至i32
(32位机的整数)作为默认值。
现在可以使用..
鲁斯特:
let vec: Vec<_> = (n .. m + 1).collect();
给你一个Vec
所有从数字n
来m
。
作为由Shepmaster的意见指出,要小心,如果你需要一个范围可达类型(最大值是行不通255
的u8
)。
需要注意的是这个答案涉及到预先1.0版本锈的和不适用1.0。 具体而言,
Vec::from_fn
除去。
有可能真的没什么惯用截至目前。 还有就是方便的功能了一把构建载体,例如,你可以使用Vec::from_fn
:
Vec::from_fn(m+1-n, |i| i+n)
由于锈1.26.0可以使用RangeToInclusive
( ..=
)运算,以生成一个包含范围。
let v: Vec<_> = (n..=m).collect()