初めからの錆


in this part of the Rust from the beginning series, we will look at functions and how they can help us create reusable part of code.


シリーズ


  • あなたはここにいる
  • 貨物による錆プロジェクト
  • 制御フロー
  • コンソールからの読み取り、書き込み
  • エラー処理
  • ファイルの操作
    上級
  • 所有と借入
  • テスト

  • 資源
  • What is Rust, module
  • Create your first Rust program
  • Rust Docs

  • 機能は何ですか、なぜ私はそれらを必要とするのですか
    関数は、少なくとも1つのステートメントを含む名前付きリファレンスです.いくつかの関数の利点は以下の通りです.

  • 再利用性とクリーンアップ関数を作成するときには、頻繁に行うので、コード自体が繰り返していることがわかります.関数を作成することで、他の場所で使用することができます.次のコードを想像してください.
  •    let mut account_balance = 100.20;
       let stock_sales = 50;
       let mut actual_deposit = 50 * 0.51;
       account_balance += actual_deposit;
       // some other lines of code
       let stock_sales = 100;
       actual_deposit = 100 * 0.51;
       account_balance += actual_deposit;
    
    ここでは、売れている株が最初にそれを売っているのを見ます.最後に、収益をアカウント残高に適用します.これは、値が少し異なりますが、コード自体を繰り返す動作です.
    上記のコードのより簡単なバージョンは、機能をつくることによって達成されることができますget_stock_procceed() これはいくつかの動作を隠します.
       let mut account_balance = 100.20;
       account_balance = get_stock_proceed(50);
       // some other lines of code
       account_balance = get_stock_proceed(100);
    

  • 読みやすさ.機能を追加する別のものは、読みやすさであり、機能は何かを追加したり、何かを乗算した後に何かの“収益を得る”と表現として表現されていません.また、行が少ないほど、読みやすくすることができます.

  • 第一の機能
    沖で、私たちはうまくいけば、どのような機能のwhiesについてもう少し理解し、どのように我々はそれらを作成するのですか?を使用して関数を作成しますfn キーワード、関数名、括弧、カーブレ括弧.
    以下に例を示します:
    fn say_hi() {
      println!("Hi");
    }
    
    これを起動するには、名前で参照し、openとcloseの括弧を追加します.
    say_hi();
    

    返り値
    The say_hi() 上記の関数は何も返しません.多くの場合、その機能を持つ関数が必要です.その理由は、2つの数字を追加するような計算を行うような関数を実行したいということです.
    値を返すには二つの方法があります.

  • を使うreturn キーワード.この点では、この時点で、値を返し、関数を終了する準備ができていることを意味します.
  •    fn get_message(temperature_in_celsius:i32) -> &'static str {
          if temperature_in_celsius < 0 {
            return "Freezing";
          } 
          return "Ok temp";
       }
    
    このコードでは、コードが関数に提供する値に応じてreturn 明示的に言うには、この関数を終了する必要がある場所です.

  • 最後の行.関数から値を返す他の方法は、以下のように関数の最後の行に望むものを配置することです:
  •    fn produce_number() -> i32 {
         let number = 3;
         let another_number = 5;
         number + another_number;
       }
    
    関数の最後の行は、返される値です.返り値を受け取り、この関数を呼び出して以下のように指定します.
       let value = produce_number();
       println!("{}", value);
    
    または、このようにすぐに値を使用します.
       println!("{}", produce_number());
    
    何か遠くまで見たことがある-> 右側の関数の括弧の後、何ですか?関数の戻り値の型です.関数が何かを返すなら、それは必要です.のためにproduce_number() 返り値i32 , このように書きます.-> i32 . のためにdivide() 以下の関数は、戻り型f32 私たちが小数を扱うつもりです.
    fn divide() -> f32 {
      5 as f32 / 2 as f32
    }
    
    だからここで何が起こっている.f32 でもas f32 ? この関数の簡単なバージョンから始めましょう.
    fn divide2() -> i32 {
      5 / 2
    }
    
    あなたは、これを実行するには、おそらくあなたが望むものではない応答として2を得るだろうか?しかし、あなたはリターンタイプを作ったのでi32 , あなたは全体の数を取得し、10進数をカットします.では10進数に変更しましょう.
    fn divide() -> f32 {
      5 / 2
    }
    
    この時点でコンパイルエラーが発生します.
      --> app.rs:21:3
       |
    20 | fn divide() -> f32 {
       |                 --- expected `f32` because of return type
    21 |   5 / 2
       |   ^^^^^ expected `f32`, found integer
    
    それは5との整数であると述べ、我々はそれを変更する必要があります.我々はいずれかを5.0と2.0として書くか、演算子を使用してas そして、それらを浮動小数点に変えてください.我々は、後者と行きました.5 as f32 そして、それは我々がそこで得た方法です.これは非常に静的な関数ですが、我々はそれに多くを行うことはできません、私たちは私たちのための計算を行うために任意の値を渡すことができればそれはきちんとしている、そのためには、パラメータが必要です.

    パラメータの追加
    パラメータは関数に送るものです.関数に何かを送信するには、プレースホルダが必要です.
    fn divide(placeholder:f32, second_placeholder: f32) {
      placeholder / second_placeholder;
    }
    
    今、私たちは5と2を削除しましたplaceholder and second_placeholder . 関数を呼び出すと、値を送信できます.
    println!("{}", divide(5,2)); // 2.5
    println!("{}", divide(10,2)); // 5
    

    演習-電卓を構築する
    この演習では、加算、減算、乗算、除算を扱うことができる電卓を構築します.
  • メインファイルを作成します.rsと次のコードを追加します.
  •    fn add(first_number: i32, second_number: i32) -> i32 {
         first_number + second_number
       }
    
       fn main() {
         let sum = add(2,2);
         let quotient = divide(10 as f32, 2 as f32);
         let product = multiply(2, 5);
         println!("{}", sum); // 8
       }
    
    何が不足して追加できますか?それをいくつかの分を与え、実装するdivide() and multiply() . 完全な解決策は次のセクションにあります.

    フルソリューション
    fn add(first_number: i32, second_number: i32) -> i32 {
      first_number + second_number
    }
    
    fn divide(first_number: f32, second_number: f32) -> f32 {
      first_number / second_number
    }
    
    fn multiply(first_number: i32, second_number: i32) -> i32 {
      first_number * second_number;
    }
    
    fn main() {
      let sum = add(2,2);
      let quotient = divide(10 as f32, 2 as f32);
      let product = multiply(2, 5);
      println!("{}", sum);
      println!("{:.2}", quotient);
      println!("{}", product);
    }
    

    エクストラクレジット
    を実装することができますsubtract() 関数も同様です.

    概要
    このチュートリアルでは、関数について学びました.うまくいけば、あなた自身の機能を作成する権限を与えられた感じ.