#はじめに
Rustの基本的な文法についてまとめてみた。第7回。第6回で書いたmatch式についてもう少し深く。
今回からはプログラムの構文として、様々なことに使われる「分岐」について。
C/C++, python ,java, rubyなどでも多くに使われる。
###目的
Rustにおける基本的な構文の理解をする。
#Rustの基本構文シリーズ
第2回⇒Rustの基本構文(2) URL: https://qiita.com/jin237/items/6910b4f803a35f317213
第3回⇒Rustの基本構文(3) URL:https://qiita.com/jin237/items/59ef229a4de30cb8203b
第4回⇒Rustの基本構文(4) URL: https://qiita.com/jin237/items/42249f984746711be0e2
第5回⇒Rustの基本構文(5) URL:https://qiita.com/jin237/items/3fc3341effb3670e5865
第6回⇒Rustの基本構文(6) URL:https://qiita.com/jin237/items/903e33226f93e7a4e5a0
#match式のパターン応用
第6回では、基本構文としてmatchの概要的なことを書いた。リテラルとアンダースコアによるパターンをやっていた。それに対して、もう少し複雑なものをやっていく。
###列挙型コード
例を引用してくる。(from 実践Rust入門 言語仕様から開発手法まで P.235 例6)
//例6
fn main(){
let unknown = Some("Apple");
let string = match unknown{
Some(something) => String::from("Hi, ") + something,
None => String::from("Nothing"),
};
println!("{}",string);
}
結果
[Running] cd "c:\Users\[username]\rust\project1\" && rustc match_function3.rs && "c:\Users\[username]\rust\project1\"match_function3
Hi, Apple
[Done] exited with code=0 in _.__ seconds
条件が並べられているものを__列挙型__という。列挙型は、パターンを使用してバリアントに関連付けられた値を取り出すことができる。上のように複合的な型の値の中から取り出すことを__分配束縛__という。
コードで簡単に説明すると、検査される値は__Option型(値の存在が不明なことを表す型:SomeとNoneの2つのバリアントを持つ)__なので、Option::Someの場合。バリアントに関連した値がsomethingの方に束縛される。something変数はSome(something)に対応する式の中だけをスコープする変数となる。
##パターンの活用
パターンを使いこなせば、列挙型のほかにも、構造体やタプル、参照についても分配束縛をできる。
###参照型について
メモリ安全なポインタ__のこと.メモリアドレスはusizeと同ビット幅の整数で表示する。
参照はポインタで指したい値に"&","&mut__"を付けることで作成。
*詳しいことについては別記事で型についてまとめるときに。
###参照コード
"&"を使うことによって参照に対する分配束縛を行うことができる。
==参照を外すということができる
例を引用してくる。(from 実践Rust入門 言語仕様から開発手法まで P.236 例7)
//例7
fn main(){
let ten = 10;
let ten_reference = &ten;
match ten_reference {
number => assert_eq!(&10, number),
};
match ten_reference {
&number => assert_eq!(10, number),
};
}
number => assert_eq!(&10, number),
によって、numberは参照である。逆に
&number => assert_eq!(10, number),
によって、numberは参照ではないといえる。
###パターンの連結
パターン連結したものや範囲指定のものを使うこともできる。
・パターンの連結には"|"を使う。
・範囲指定には"..."を使う。
・パターンの中にif式(条件付け)もできる。パターンにつける条件のことを__ガード__という。
これらの詳細は省略。
#if let式
簡単にいうと、match式の一部をif let式で書けるという意味。matchより分岐の幅を広げることができる。
if let式に対してのパターンは一つしか書くことができないが、パターンマッチ成功か失敗によっての分岐が可能となる。
例を引用してくる。(from 実践Rust入門 言語仕様から開発手法まで P.237-238 例10)
//例10
fn main(){
let score = Some(100);
if let Some(100) = score{
println!("You got full marks!");
}else{
println!("You didn't get full marks.");
};
}
結果
[Running] cd "c:\Users\[username]\rust\project1\" && rustc iflet_function.rs && "c:\Users\[username]\rust\project1\"iflet_function
You got full marks!
[Done] exited with code=0 in _.__ seconds
コードの流れは以下のコメントアウト//の部分をみてもらうことで分かる
fn main(){
let score = Some(100);
//if let パターン = 変数
if let Some(100) = score{
//パターンマッチの成功時に実行される節(true節)
println!("You got full marks!");
}else{
//パターンマッチの失敗時に実行される節(false節) <= 省略可能
println!("You didn't get full marks.");
};
}
if式と同様にfalse節は省略ができる。戻り値の一致も同様。
#さいごに
分岐をずっとやってきたが、ここでとりあえず終了。このあたりから型などの話も出てくるので、どこかのタイミングでまとめたい。とりあえずは、大体の文法の後になると思う。次回は__繰り返し__について。