前回の記事
https://qiita.com/on_c98/items/db88c333d2e78f30bd8f
Rustの関数
宣言
Rustで関数を宣言する際はfnキーワードを用います。
fn main(){
foo();
}
fn foo(){
println!("fooo!!");
}
Rustでは、関数の定義する順番(位置)は気にしません。上記の場合、foo関数はmain関数より後に定義されていますが、main内で使用することが出来ます。
Rustでは、関数の名前はスネークケース(全て小文字で単語をアンダーバーでつなげる書き方)を使うのが慣習となっています。
fn snake_case_naming(){}
Rustの関数は、引数を受け取ることが出来ます。関数名のカッコ内に(引数名: 型)のように記述します。
fn main(){
hello("佐藤");
}
fn hello(name: &str) {
println!("Hello {}", name);
}
Rustでは、「デフォルト引数」「オプション引数」と呼ばれるような、省略された場合に既定の値をセットするような機能は、今のところ実装されていません。
また、「可変引数」のような可変長の引数を受け取る関数を定義することもできません。そのような場合は、println!のようにマクロとして実装するか、Vec型として受け取ることで疑似的に可変長の引数を実現出来ます。
fn main(){
// `vec!`は手軽にVecを作成するマクロです。
foo("aa", "ii", vec!["uu", "ee", "oo"]);
}
fn foo(first: &str, second: &str, etc: Vec<&str>) {
println!("first: {}", first);
println!("second: {}", second);
for (i, v) in etc.into_iter().enumerate() {
println!("etc{}: {}", i, v);
}
}
戻り値を返したい場合は、->を用いて下記のように記述します。
fn bar(arg: i32) -> i32 {
arg * 2
}
上記の関数barは、引数で受け取った値を2倍にして返しています。
末尾にセミコロンを付けないとそれは式(Expression)として扱われます。Rustでは処理中に式が現れた場合、それを戻り値として返します。末尾にセミコロンがついている場合それは文(statement)として扱われます。
Rustにおいて、式とは「値を返すもの」、文は「処理を実行するが値を返さないもの」、となります。
fn foo() -> i32 {
// コメントは式でも文でもない
let z = 4; // 文 statement
let x = 1 + z; // 文 statement
bar(); // 文
x + 1; // 末尾にセミコロンが付いているので文として扱われる。
x + 1 // こちらはセミコロンがないので式 expression として扱われる。 foo()関数の戻り値として返される。
}
最後に
次回はif、for、while、loopについて書いていこうと思います。