Part11:パターンマッチング

凛「今回はパターンマッチングにゃ!」
海未「ちゃんと調べてきましたか?」
凛「ばっちりにゃ!」
希「お、自信たっぷりやね」
凛「それじゃ、行っくにゃー!」
希「にゃー!」
海未「・・・に、にゃー」

凛「えーっとね、Elixirには=って演算子があって、左右の値が同じかどうかを比較できるにゃ」
海未「前回希が説明してくれた=====とは違うのですか?」
凛「すんごく紛らわしいんだけど、違うんだよ。見て見て」

凛「違いその1。==だと結果はbooleanだけど、=だと左右の値そのものになって、一致しないとエラー吐くにゃ」
希「これだけだと、なんだかようわからんけど・・・」
凛「でね、これに変数を使うと・・・」

凛「違いその2。左辺が変数だと右辺の値が代入されるにゃ」
希「まあ、ここだけ見ると普通やね」
海未「普通・・・?」
希「こっちの話や」

凛「こうすると普通じゃないにゃ」
海未「ですが、これは分かります。左右は一致していますからね」
凛「なんか比較と代入が同時にできる便利演算子だと思えばいいにゃ」
希「左右をマッチングする、ってことなんやろうけど、パターンってどういうことなん?」
凛「今は1つの値同士しかマッチングしてないけど、もっと複雑なデータ構造にマッチさせたりもできるんだよ。そのへんを見ていくと、パターンっぽいな、ってなるにゃ」

凛「ちょっとだけ難しくするね。タプルをマッチさせると・・・」

凛「タプルの要素数が合っていれば代入、合ってなければエラーにゃ」

凛「要素数が合ってても型が違うとだめにゃ」
希「型とか要素数とかのパターンが一致してれば代入できる、ってことやね」
凛「うん。それと、左辺は変数ばかりとは限らないにゃ」

凛「左辺のタプルの1個目に:kosakaって値があるから、右辺の1個目も:kosakaでないとだめにゃ」
希「これもパターンの一部なんやね」

凛「リストにはhdとかtlとかあったよね。|を使ってあんな感じのマッチもできるよ」

凛「こういうのはリストの分解を狙った使い方にゃ」
海未「=ひとつでいろいろできる、まさに便利演算子ですね」

凛「左辺で同じ変数を何度か使うのもできるんだけど」

凛「同じ変数に違う値は入れられないにゃ」
希「変数展開すると{"rin", "rin"} = {"rin", "pana"}やからマッチしないってことやね」
凛「なんだけど・・・」

凛「^をつけるとまた話が変わってくるにゃ」
海未「・・・難しくなってきました」
凛「えへーん、そうであろう、そうであろう」
希「ここぞとばかりに調子に乗っとるな」
凛「^はピン演算子というにゃ。Elixirの変数は、基本的に、さ、再束縛可能だけど、ピン演算子を使うと、えーと、再束縛されなくなって、元の値にマッチ・・・」
希「あかん」
海未「凛、カンペは堂々と見てもいいのですよ」
凛「凛だってちょっとくらい見栄張りたいにゃ!」

凛「・・・とにかく、そういうことにゃ」
海未「^nameは代入の対象にならずに”rin”とマッチするのですね」
希「代入じゃなくて比較だけを目的とする場合に使う感じやね」
凛「・・・海未ちゃんも希ちゃんも頭いいからすぐわかるにゃ」
海未「凛のおかげですよ」
凛「ふぇっ!?」
希「せやな。凛ちゃんが頑張っていろいろ調べてきたおかげや」
凛「・・・うん♪」

凛「もうちょっとだけ続くのにゃ」
希「壮大な続編が待ってる系やね」
凛「ううん、ほんとにちょっとにゃ」

凛「_っていうのがあるにゃ」

凛「何にでもマッチするから、パターンの一部を無視したいときなんかに使うといいよ」
海未「本当に値は捨てられてしまうのですね」
凛「変数じゃないから後から参照はできないにゃ」

凛「これがElixirのパターンマッチングにゃ」
希「他の言語じゃあんまり見かけん仕組みやね」
海未「希、以前から気になっていたのですが・・・その妙な知識はどこから?」
希「Elixir始めてから、いろんな人と話してるんよ。この前も、Donald Knuthの守護霊と」
凛「それやばいやつにゃ!」
海未「希!早く引き返してください!」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です