Rust ですべての整数を含むリストを作成するにはどうすればよいですか? Haskell[n..m]
または Pythonに相当するものを探してrange(n, m+1)
いますが、何も見つかりません。
私はint::range
関数を認識しており、それが私が探していたものだと思っていましたが、それを生成するのではなく、範囲を反復するように作られています。
Rust ですべての整数を含むリストを作成するにはどうすればよいですか? Haskell[n..m]
または Pythonに相当するものを探してrange(n, m+1)
いますが、何も見つかりません。
私はint::range
関数を認識しており、それが私が探していたものだと思っていましたが、それを生成するのではなく、範囲を反復するように作られています。
..=
Rustで使用できるようになりました。
let vec: Vec<_> = (n ..= m).collect();
Vec
から までのすべての数字からn
を返しますm
。
..=
は包括的範囲演算子ですが、..
排他的です。
この回答は Rust の 1.0 より前のバージョンに関するものであり、1.0 には適用されないことに注意してください。具体的に
Vec::from_fn
は、削除されました。
おそらく今のところ、本当に慣用的なものは何もありません。ベクトルを構築するための便利な関数がいくつかあります。たとえば、次のように使用できますVec::from_fn
。
Vec::from_fn(m+1-n, |i| i+n)
この回答は Rust の 1.0 より前のバージョンに関するものであり、1.0 には適用されないことに注意してください。具体的には、
std::iter::range
とstd::iter::range_inclusive
が削除されました。
Rust 1.0.0-alpha の時点で、これを実現する最も簡単な方法は、モジュールで提供されている便利な関数std::iter
:range
およびを使用することです。これらの関数はrange_inclusive
、[low, high) または [low, high] の範囲の数値のリストを生成するイテレータを返します。 、 それぞれ。
さらに、次の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
ても式の型を推測できますが、型を完全に推測できない最も一般的なケースの 1 つです。この場合は、 trait を実装する具体的な型を推測できないためですFromIterator<A>
。の戻り値の型collect
。
ジェネリック戻り値の型は、let
定義ステートメントで明示的な型として指定するか、function::<Type>()
構文を使用してインラインで指定できます。を実装している具体的な型がわからないという理由だけで推論が失敗するためFromIterator<A>
、ジェネリック型を明示的に指定すると、 によって示される推論される型引数に「穴」が残る可能性があります_
。これは、collect
上記の 2 番目の呼び出しで行われます。式では、要素を受け取るコンテナーが aでVec<_>
あることが明示的に指定されていますが、コンパイラーは正確な型が何であるかを判断します。現在、型が指定されておらず、推論できない整数は、デフォルトとして (32 ビットの機械整数) にフォールバックします。collect
Vec<T>
T
i32