例の錆。 パート2

これは、例によるRustの翻訳に関する一連の記事の第2部です。 最初の部分はここで読むことができます



続行しますか?



内容



  1. 表現
  2. 支店オペレーター
  3. 蝶番
  4. whileループ
  5. forループおよび範囲関数
  6. 機能


1.式



Rustでは、ほとんどすべてのステートメント(ステートメント)も式です。つまり、何らかの結果を返すことができます。 この動作は必ずしも必要ではないため、何も返さないでください; add ; 最後まで。



ブロック内の式はr-valuesとして使用でき、後者はl-valueとして割り当てられます

* ここで読む右辺値と左辺値とは何ですか。



ただし、ブロック内の最後の式がセミコロンでダウンロードされた場合、結果は空のタプル()に等しくなります。



fn main() { let x = 5u; let y = { let x_squared = x * x; let x_cube = x_squared * x; // `y`    x_cube + x_squared + x }; let z = { //       ,    // ,    `z`   `()` 2 * x; }; println!("x is {}", x); println!("y is {}", y); println!("z is {}", z); }
      
      





2.分岐演算子



if-else



はCに似ています。 Cとは異なり、論理条件は括弧で囲むべきではなく、各条件の後に中括弧が必要です。



if-else



も式です。 また、Rustのタイプセーフのため、すべてのブランチは同じタイプの値を返す必要があります。



 fn main() { let n = 5i; if n < 0 { print!("{} is negative", n); } else if n > 0 { print!("{} is positive", n); } else { print!("{} is zero", n); } let big_n = if n < 10 && n > -10 { println!(", and is a small number, increase ten-fold"); //    `int` 10 * n } else { println!(", and is a big number, reduce by two"); //     `int` n / 2 // ^      }; println!("{} -> {}", n, big_n); }
      
      





3.ループ



Rustキーワードloop



は、無限ループを作成します。



break



ステートメントを使用すると、ループをいつでも終了できますが、 continue



は残りの反復をスキップして、実行を再開します。



 fn main() { let mut count = 0u; println!("Let's count until infinity!"); //   loop { count += 1; if count == 3 { println!("three"); //      continue; } println!("{}", count); if count == 5 { println!("OK, that's enough"); //     break; } } }
      
      





3.1ネストとタグ


ループはネストできます。 このような場合、ラベル'label



含める必要があり、 break/continue



ステートメントはこのラベルで記述されます。



 fn main() { 'outer: loop { println!("Entered the outer loop"); 'inner: loop { println!("Entered the inner loop"); //     //break; //     break 'outer; } println!("This point will never be reached"); } println!("Exited the outer loop"); }
      
      





4. whileループ



whileの条件がtrueの間、ループの本体が実行されます。



while



を使用してfizzbuzzを書きましょう。



 fn main() { //    let mut n = 1u; //   `n`  101 while n < 101 { if n % 15 == 0 { println!("fizzbuzz"); } else if n % 3 == 0 { println!("fizz"); } else if n % 5 == 0 { println!("buzz"); } else { println!("{}", n); } //   n += 1; } }
      
      





5. forループおよび範囲関数



for in



構文を使用して、 Iterator



と遅延ジェネレーターを反復処理できます(これについては後で説明します)。 range



関数は、最も一般的な反復子の1つです。 range(a, b)



range(a, b)



からb-1までの値を生成し、ステップを1つずつ変更します。



whileの代わりにfor



を使用for



てfizzbuzzを書きましょう。



 fn main() { // `n`   : 1, 2, ..., 100    for n in range(1u, 101) { if n % 15 == 0 { println!("fizzbuzz"); } else if n % 3 == 0 { println!("fizz"); } else if n % 5 == 0 { println!("buzz"); } else { println!("{}", n); } } }
      
      





6.機能



関数は、 fnキーワードを使用して宣言されます。 引数には、変数などの型で注釈が付けられます。 また、関数が値を返す場合、矢印->の後に戻り値の型を指定する必要があります。



関数の本体の最後の式が戻り値として使用されます。または、 return



を使用して、内部ループや条件ステートメントからでも、関数から値を早期にreturn



ことができます。



関数を使用してfizzbuzzを書き換える!



 // ,     fn is_divisible_by(lhs: uint, rhs: uint) -> bool { //   ,     if rhs == 0 { return false; } //  ,     `return`    lhs % rhs == 0 } // ,    ,      `()` fn fizzbuzz(n: uint) -> () { if is_divisible_by(n, 15) { println!("fizzbuzz"); } else if is_divisible_by(n, 3) { println!("fizz"); } else if is_divisible_by(n, 5) { println!("buzz"); } else { println!("{}", n); } } //    `()`,     fn fizzbuzz_to(n: uint) { for n in range(1, n + 1) { fizzbuzz(n); } } fn main() { fizzbuzz_to(100); }
      
      





6.1未使用の関数


コンパイラは、未使用の関数を警告するdead_code



lintを提供します。 属性#[allow(dead_code)]



を追加して、通知を無効にすることができます。



 fn used_function() {} // `#[allow(dead_code)]`  ,    `dead_code` #[allow(dead_code)] fn unused_function() {} fn noisy_unused_function() {} //  ^  ,    fn main() { used_function(); }
      
      





実際のプログラムでは、「デッドコード」を排除する必要があることに注意してください。 これらの例では、デモンストレーションに使用します。



おわりに



この言語の詳細については、グーグルグループRust in Russianに参加してください。

Githubで翻訳を支援できます: github.com/eg0r/rust-by-example



すべてのコメント、エラー、または不正確なものをメールで送信してください。



All Articles