在防锈,什么是Haskell的[n..m]的惯用相同呢? [重复](In Rust, what

2019-08-19 20:38发布

这个问题已经在这里有一个答案:

  • 如何包括一系列终值? 2个回答

如何产生含铁锈的所有整数的列表? 我在寻找Haskell的等效[n..m]或Python的range(n, m+1)但无法找到任何东西。

我知道的int::range功能,并认为这是我一直在寻找,但它是由迭代一个范围,而不是生产。

Answer 1:

需要注意的是这个答案涉及到预先1.0版本锈的和不适用1.0。 具体而言, std::iter::rangestd::iter::range_inclusive除去。

作为防锈1.0.0-α,完成此过程的最简单的方法是使用在模块中提供的功能的便利std::iterrangerange_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<_>它的显式指定,该容器接收来自元件collectVec<T>但是编译器将断定哪些确切类型T必须。 目前,其整数类型未指定,不能推断回落至i32 (32位机的整数)作为默认值。



Answer 2:

现在可以使用..鲁斯特:

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

给你一个Vec所有从数字nm

作为由Shepmaster的意见指出,要小心,如果你需要一个范围可达类型(最大值是行不通255u8 )。



Answer 3:

需要注意的是这个答案涉及到预先1.0版本锈的和不适用1.0。 具体而言, Vec::from_fn除去。

有可能真的没什么惯用截至目前。 还有就是方便的功能了一把构建载体,例如,你可以使用Vec::from_fn

Vec::from_fn(m+1-n, |i| i+n)


Answer 4:

由于锈1.26.0可以使用RangeToInclusive..= )运算,以生成一个包含范围。

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


文章来源: In Rust, what is the idiomatic equivalent of Haskell's [n..m]? [duplicate]
标签: rust