プログラミング

Rustで関数を使ってみよう!

こんにちは、MSKです。
今回はRustで関数を扱ってみたいと思います。
繰り返し使う処理をまとめることができるなど、ソースコードの可読性が上がるのでマスターしたい機能です。

Rustのインストールなど

Rustのインストールなどの準備は以下の記事を参考にしてみてください。
過去の記事は以下になります。

Rustをインストールして使ってみよう!仕事で使っているチップも今まではC言語のみ対応でしたが、近いうちにRustにも対応するといったアナウンスがでるなど組み込み系の仕事でも使用されるようになってきています。 今日はそのRustについて特徴を紹介し、定番の「Hello World」を表示したいと思います。...
Rustで変数を使ってみよう!Rustで変数を使うことについて解説を行います。...

関数とは

数学にも関数というものがありました。

例えば、f(x)=x+1g(x,y)=x \times yのようなものでした。
xやyなどを入れると関数に定義してある式により計算された値が返されました。

例えば、上の例のf(x)x=1を入れるとf(1) = 1+1=2というかんじです。

プログラミングで使用する関数も数学の関数と同じで関数に引数というものを渡して、その値を元に関数の中で処理が行われ、処理の結果として返り値を受け取ります。

プログラミングで使用する関数が数学の関数と違う点は引数や返り値がない関数も作成できるということです。

プログラムを書きながら関数について理解していきましょう!

関数を作ってみよう

まずは引数も返り値もない関数を作ります。

fn hello() 
{
    println!("Hello!!!");
}

fn main() 
{
    hello();
}

引数も戻り値もないhello()関数を作りました。
実行してみましょう!
実行するにはbuildしてrunします。

cargo build
cargo run

Hello!!!と表示されたと思います。

Rustの関数は「fn」というキーワードで始まります。(function(関数)からきています。)
fnをつけると今から関数を定義しますよ、ということを宣言することになります。

fnの後には関数の名前を入力します。
今回はfnの後にhelloと書いているので関数の名前は「hello」になります。

名前の後には引数を渡すために「()」をつけますが、今回は引数がない関数を作っているので()の中には何も記述していません。

関数を使う場合は関数の名前+()という形で呼び出します。(もし引数がある場合は()の中に値を入れてあげます。詳しくは後の例で見ていきます。)

このhello関数の形を見て、どこかで見た形と思いませんでしたか?
そうです!
mainの部分と同じです!
mainも関数の1つなのです。
(main関数は特別な関数でRustのデフォルトでは最初に実行される関数です。)

値を受け取る関数を作ってみよう

次に関数が値を受け取る関数を作ります。

fn get_one_parameter(x:i32)
{
    println!("get one parameter:{}",x);
}

fn get_two_parameter(x:i32,y:i32)
{
    println!("get two parameter:{} and {}",x,y);
}

fn main()
{
    get_one_parameter(1);
    get_two_parameter(1, 2);
}

実行してみましょう!

get one parameter:1
get two parameter:1 and 2

と出力されたと思います。

関数が値を受け取るためには「()」の中に値を入れてあげます。
()の中に入れる値を引数と呼びます。

引数は「変数名:型」という形で記述します。
今回は32bitの符号あり整数を使用しているのでi32としています。
Rustの関数では型を省略することができません。

引数が複数ある場合は「,」で区切って上げて順番に並べます。

関数の呼び出しは引数なしの関数と同じで関数名を書いて呼び出しますが、()の中に渡す値を書いてあげます。
引数が複数の場合には関数の定義と同じく、「,」で区切って定義した順番通りに値を入れてあげます。

今はi32型の1、2を渡しているのでよいのですが、i32型でない値を渡したらどうなるのでしょう?
試してみます。

fn main() {
    get_one_parameter(1.234);
    get_two_parameter(1, "moji");
}

cargo buildと以下のようにエラーが表示されます。

エラー

error[E0609]: no field ’23’ on type ‘()’
–> src/main.rs:21:26
|
21 | get_one_parameter(1).23;
| ^^

error[E0308]: mismatched types
–> src/main.rs:22:26
|
22 | get_two_parameter(1, “moji”);
| ^^^^^^ expected ‘i32’, found ‘&str&

error: aborting due to 2 previous errors

Some errors have detailed explanations: E0308, E0609.
For more information about an error, try ‘rustc –explain E0308’.

定義した型以外を間違えて関数の引数に渡した場合、コンパイラーがエラーにしてくれます。

値を返す関数を作ってみよう

最後に値を返す関数を作ってみます。

fn f(x:i32)->i32
{
    x+1
}

fn g(x:i32 , y:i32)->i32 
{
    x*y
}

fn main() 
{
    println!("f(1) = {}",f(1));
    println!("g(12,34)={}",g(12,34));
}

このプログラムを実行してみます。

f(1) = 2
g(12,34)=408

と表示されたと思います。

関数は1つだけ値を返すことができます。
関数が返す値を返り値と言います。
関数で値を返すには、関数名()の後ろに「->型」という形で返り値の型を指定します。
返す値自体は関数の最後の行に記述します。
(上のプログラムでいうとx+1やx*yになります。)

※C/C++などのようにreturnを使って値を返すこともできますが、Rustではreturnを使わずに関数の最後の式の結果を返り値とするほうが好ましいとされています。
returnが使われる場面は関数の途中で値を返す場合がほとんどです。

まとめ

今回はRustの関数の基本について解説を行いました。
関数の基本についてまとめます。

  • 関数を定義するためには、「fn」を頭につけてその後ろに関数の名前を入力します。
  • 引数は関数に渡す値で、関数名の後ろの()の中に記述します。
  • 複数の引数を持つときは、「,」で区切ります。
  • 返り値は関数が返す値で、その型を関数名()の後ろに「->型」と書くことで値を返すことができます。
  • 関数が返す値は関数の一番最後の式として与えます。

最後までご覧いただき、ありがとうございました。
以上、「Rustで関数を使ってみよう!」でした。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近RustとReact、結び目理論と曲面結び目理論にはまっています。