【问题标题】:In Rust, what is the idiomatic equivalent of Haskell's [n..m]? [duplicate]在 Rust 中,Haskell 的 [n..m] 的惯用等价物是什么? [复制]
【发布时间】:2013-04-05 14:08:56
【问题描述】:

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

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

【问题讨论】:

  • 请注意,由于 Haskell 的惰性求值,它的列表类型实际上由一个元素和一个函数组成,以继续生成列表的其余部分(即下一个元素和 next 函数,等等),这意味着在许多方面,Rust 的 Iterator 类型实际上在语义上更接近 Haskell 的 [a] 而不是 Vec<T>

标签: rust


【解决方案1】:

现在可以在 Rust 中使用 ..=

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

nm 的所有数字中为您提供Vec

..= 是包含范围运算符,而.. 是排除的。

【讨论】:

  • to m inclusive — 迂腐地说,它并不是真正的包容性。例如,没有简单的方法来获取从 0 到 255 的所有 u8 值。有各种浮动的 RFC 建议添加一个包含范围运算符。
  • 这也可以写成let vec = Vec::from_iter(n .. m + 1)
【解决方案2】:

请注意,此答案适用于 1.0 之前的 Rust 版本,不适用于 1.0。具体来说,Vec::from_fn 已被删除。

到目前为止,可能还没有什么真正的惯用语。有一些方便的函数来构造向量,例如你可以使用Vec::from_fn:

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

【讨论】:

【解决方案3】:

请注意,此答案适用于 1.0 之前的 Rust 版本,不适用于 1.0。具体来说,std::iter::rangestd::iter::range_inclusive 已被删除。

从 Rust 1.0.0-alpha 开始,最简单的方法是使用模块 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 的返回值在上面的两种用法中都明确指定了其类型。通常,Rust 编译器可以在没有明确说明的情况下推断表达式的类型,但 collect 是无法完全推断类型的最常见情况之一,在这种情况下,因为它无法推断出实现的具体类型特征FromIterator&lt;A&gt;collect的返回类型。

泛型返回值的类型可以在let 定义语句中指定为显式类型,也可以使用function::&lt;Type&gt;() 语法指定为内联类型。由于推理失败只是因为不知道实现FromIterator&lt;A&gt; 的具体类型,因此在显式指定泛型类型时,可能会为将被推断的类型参数留下“漏洞”,由_ 表示。这是通过上面对collect 的第二次调用完成的——在表达式Vec&lt;_&gt; 中,明确指定从collect 接收元素的容器是Vec&lt;T&gt;,但编译器会确定T 必须的确切类型是。目前,未指定类型且无法推断的整数默认回退到i32(32 位机器整数)。

【讨论】:

    【解决方案4】:

    从 Rust 1.26.0 开始,您可以使用 RangeToInclusive (..=) 运算符生成包含范围。

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

    【讨论】:

      猜你喜欢
      • 2022-11-03
      • 2017-04-10
      • 2011-08-09
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      相关资源
      最近更新 更多