2017-04-09 1 views
2

は、私は1つの行にこれを行うことができます。Rust's forループで複数の変数を使用するにはどうすればよいですか?言語のCファミリーで

for(int i = lo, int j = mid+1; i <= mid && j <= hi; i++, j++){ 
    ... 
} 

しかしルーストに...私はこのようにそれを書き込むことができます。

for i in lo..mid+1 { 
    let mut j = mid+1; 
    if j <= hi { 
     break; 
    } 
    ... 
    j += 1; 
} 

は、より効率的があるのですこれを実装する方法は?反復子を使用


は、上記のために働くが、反復子を使用してそのような錆で

for (int i = 0; i < n; i ++) { 
    if (a[i] == ...) { 
     i += 5; 
    } 
} 

として煩雑演算を使用してのようないくつかの機会を作る、これは動作しません。変数iは5ずつ増加が、1によって代わりにされません。

for i in 0..n { 
    if a[i] == ... { 
     i += 5; 
    } 
} 
+0

は、それが動作します〜ありがとうございます。 Rust's forループはイテレータを使用しています。これは、算術演算のようないくつかの機会を少し面倒にします。 'for(int i = 0; i wind2412

答えて

4

次の2つの平行範囲イテレータを作成することができ、zip彼らは、組み合わせても反復:

fn main() { 
    let values = [10, 20, 30, 40, 50, 60, 70, 80, 90]; 
    let lo = 2; 
    let mid = 5; 
    let hi = 7; 

    let early_indexes = lo..(mid + 1); 
    let late_indexes = (mid + 1)..(hi + 1); 
    for (i, j) in early_indexes.zip(late_indexes) { 
     println!("{}, {}", i, j); 
     println!("{} - {}", values[i], values[j]); 
    } 
} 

いつかを、 (最終的な構文に応じて)

let early_indexes = lo...mid; 
let late_indexes = (mid + 1)...hi; 
for (i, j) in early_indexes.zip(late_indexes) { 
    println!("{}, {}", i, j); 
    println!("{} - {}", values[i], values[j]); 
} 
のようにすることができます。

私は私の例のために示されてきたように、あなたが実際にスライスものの反復されている場合は、あなたもちょうど直接2回の反復子を組み合わせて、インデックスを無視することができます。

let early_values = values[lo..(mid + 1)].iter(); 
let late_values = values[(mid + 1)..(hi + 1)].iter(); 
for (i, j) in early_values.zip(late_values) { 
    println!("{}, {}", i, j); 
} 

変数iはしません代わりに1だけインクリメントされます。

はい、ステップごとに増分するのは面倒ですが、ある日はit will also be stabilizedとなります。それまでの間:あなたが完全に制御する必要がある場合は

、あなたは常にwhileまたはloopを使用することができます。

let mut i = 0; 
while i < n { 
    if a[i] == ... { 
     i += 5; 
    } 

    i += 1; 
} 
+0

私の問題を解決する詳細な説明をありがとう! 〜 – wind2412

関連する問題