はじめに

関数は処理に名前を付けたもので、プログラムは必要なときにその処理を呼び出せます。関数はパラメーターを使って入力を受け取り、計算した値を返せます。

この実験では、用意済みのCargoプロジェクトに、3つの変換関数とそれらの呼び出しがすでに含まれています。各ステップで、プレースホルダーになっている式を1つ置き換えます。入力する量を少なくしながら、関数定義、パラメーター、戻り値の型、式、関数呼び出しがどのように結び付くかを確認できます。

関数から値を返す

このステップでは、分を秒に変換する関数を完成させ、その定義と呼び出しを確認します。

用意されたプロジェクトに移動し、ソースファイルを開きます。

cd /home/labex/project/conversion-tool
nano src/main.rs

ファイルの先頭にある次の行は、関数定義の開始を示しています。

fn minutes_to_seconds(minutes: i32) -> i32 {
  • fn は関数を定義するキーワードです。
  • minutes_to_seconds は関数名です。
  • minutes: i32 はパラメーターです。minutes という名前の入力を受け取り、その型は整数型の i32 です。
  • -> i32 は、この関数が i32 型の値を返すことを示します。
  • 波括弧の中に関数本体を記述します。

Rustは、関数シグネチャに基づいて各呼び出しを検査します。呼び出し側は、決められた数の引数を宣言された順序で渡し、それぞれの引数は互換性のある型でなければなりません。

Step 1のコメントの前にある 0 だけを、次の内容に置き換えます。

    minutes * 60 // Step 1: replace this placeholder expression.

minutes * 60 にはセミコロンがないことに注目してください。これは関数本体の最後にある式なので、その値が関数の戻り値になります。セミコロンを付けると、値を返さない文になります。

Ctrl+Oで保存し、Enterキーを押してから、Ctrl+Xで終了します。コードを確認します。

cargo check

mainにある minutes_to_seconds(5) は関数呼び出しです。値 5 は、パラメーター minutes に渡す引数です。プログラムを実行します。

cargo run --quiet

最初の行が次のようになれば成功です。

5 minutes = 300 seconds

小数のパラメーターと戻り値の型を使う

このステップでは、浮動小数点値を受け取り、返す2つ目の関数を完成させます。

ソースファイルを開きます。

nano src/main.rs

celsius_to_fahrenheitを探します。この関数のパラメーターと戻り値の型はどちらも f64 なので、小数を含む計算結果を保持できます。一時的な式 celsius * 0.0 はパラメーターを使用しますが、意図的に0を返します。この式全体を、次の内容に置き換えます。

    celsius * 9.0 / 5.0 + 32.0 // Step 2: replace this placeholder expression.

これも式による戻り値です。計算結果が関数本体の最後にあり、セミコロンが付いていません。通常の算術演算の優先順位に従い、乗算と除算が加算より先に評価されます。より複雑な評価順を明確にしたい場合は、括弧を使えます。呼び出し側は計算式を知る必要がありません。摂氏の値を引数として渡し、戻り値として華氏の値を受け取ります。

保存して終了し、プログラムを実行します。

cargo run --quiet

2行目が次のようになれば成功です。

20.0 C = 68.0 F

celsius_to_fahrenheit(20.0) という呼び出しは、1つの引数を渡しています。戻り値は fahrenheit という束縛に保存されてから、表示用に整形されます。

複数の引数で関数を再利用する

このステップでは、2つのパラメーターを持つ関数を完成させ、その関数が2回の呼び出しで再利用されることを確認します。

用意された scale_amount 関数は、amount と factor を受け取ります。パラメーターはカンマで区切り、それぞれに型を指定します。関数を呼び出すときは、同じ順序で引数を渡す必要があります。

ファイルを開き、Step 3のプレースホルダーを探します。

nano src/main.rs

一時的な式 amount * factor * 0.0 は、意図的に0を返します。この式全体を、次の内容に置き換えます。

    amount * factor // Step 3: replace this placeholder expression.

保存して終了し、最後のチェックを実行します。

cargo check

完成したプログラムを実行します。

cargo run --quiet

同じ関数が、1回は小麦粉に、もう1回は水に対して呼び出されます。最後の2行が次のようになれば成功です。

Scaled flour: 375.0 g
Scaled water: 270.0 ml

これが関数の主な利点です。計算を1度だけ定義して分かりやすい名前を付け、異なる引数を使って再利用できます。

まとめ

整数型と浮動小数点型のパラメーターを持つ関数を完成させ、戻り値の型を示す矢印を読み取り、最後の式で値を返し、関数呼び出しで引数を渡し、1つの関数を複数の計算に再利用しました。