在Rust中,Haskell的[n..m]的惯用等价物是什么?

时间:2013-04-05 14:08:56

标签: rust

如何生成包含Rust中所有整数的列表?我正在寻找相当于Haskell的[n..m]或Python的range(n, m+1),但找不到任何东西。

我知道int::range函数并且认为它是我正在寻找的,但它是在一个范围内迭代,而不是生成它。

4 个答案:

答案 0 :(得分:14)

现在可以在Rust中使用..

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

Vecn的所有数字中为您提供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::rangestd::iter::range_inclusive已被删除。

从Rust 1.0.0-alpha开始,最简单的方法是使用模块std::iter中提供的便捷函数:rangerange_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()