web-dev-qa-db-ja.com

Rustでどのように範囲を作成しますか?

ドキュメントはその方​​法を述べておらず、チュートリアルはforループを完全に無視します。

28
mcandre

1.0以降、forループは Iterator trait を使用して型の値を処理します。

本はこのテクニックを .5章13.2章 で説明しています。

Forループの動作に興味がある場合は、ここで説明されている構文糖を参照してください。

http://doc.Rust-lang.org/std/iter/index.html

例:

fn main() {
    let strs = ["red", "green", "blue"];

    for sptr in strs.iter() {
        println!("{}", sptr);
    }
}

遊び場

Cのforループのように、数値の範囲を反復処理するだけの場合は、a..b構文を使用して数値範囲を作成できます。

for i in 0..3 {
    println!("{}", i);
}

インデックスと配列の要素の両方が必要な場合、それを取得する慣用的な方法は Iterator::enumerate メソッドを使用することです。

fn main() {
    let strs = ["red", "green", "blue"];

    for (i, s) in strs.iter().enumerate() {
        println!("String #{} is {}", i, s);
    }
}

ノート:

  • ループ項目は、iteratee要素への借用参照です。この場合、strsの要素はタイプ&'static strを持ちます-それらは静的文字列へのポインタを借りています。つまり、sptrの型は&&'static strであるため、*sptrとして逆参照します。私が好む代替形式は次のとおりです。

    for &s in strs.iter() {
        println!("{}", s);
    }
    
23
nejucomo

実際、チュートリアルの Loops セクションはforループをカバーしています:

ベクトルを反復する場合は、代わりにforを使用してください。

for elt in ["red", "green", "blue"] {
   std::io::println(elt);
}

ただし、インデックスが必要な場合は、 uint::rangeコアライブラリの関数 (またはint::rangeまたはu8::rangeまたはu32::rangeまたはu64::range)およびRustのブロックの構文:

range(0u, 64u, {|i| C[i] = A[i] + B[i]});

Rustはこの同等の構文をサポートするために使用されていましたが、後で削除されました。

range(0u, 64u) {|i|
    C[i] = A[i] + B[i];
}
11
Lindsey Kuper

for i in range(0, 100)は、_for i in 0..100_(_rustc 1.0.0-nightly_に準拠)のために廃止されました。

また、注目に値するのは、範囲内の識別子(_for i in 0..a_など)を使用してもコンパイラーが曖昧さを解消できないため、for i in (0..a)を使用する必要があるためです pull request =これを修正するために送信されました。

10
confused00

Rustc 0.4(2012年10月)以降、

range(0u, 64u) {|i|
    C[i] = A[i] + B[i];
}

サポートされなくなったようです。

2
Bob Hansen

int :: range を使用します。

0
mcandre