36

ドキュメントには方法が記載されておらず、チュートリアルでは for ループが完全に無視されています。

4

6 に答える 6

31

1.0 の時点で、forループはIteratortraitを持つ型の値で機能します。

この本では、この手法について3.5章と13.2章で説明しています。

forループがどのように動作するかに興味がある場合は、モジュール std::iterで説明されている構文糖衣を参照してください。

例:

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は type&&'static strがあることを意味するので、 として逆参照し*sptrます。私が好む別の形式は次のとおりです。

      for &s in strs.iter() {
          println!("{}", s);
      }
    
于 2013-10-02T19:18:51.567 に答える
10

実際、チュートリアルのループ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];
}
于 2012-02-14T18:40:37.833 に答える
10

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)、 を使用する必要がありますが、これを修正するためにプル リクエストが送信されています。

于 2015-01-13T11:16:58.027 に答える
0

rustc 0.4(2012年10月)の時点で、

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

もうサポートされていないようです。

于 2012-10-31T18:37:48.220 に答える
-1

int::rangeを使用します。

于 2012-02-14T05:05:15.350 に答える