プログラミングElixir第2章
2020/06/16
第2章 パターンマッチ
Cでいうところの代入記述は、Elixirではパターンマッチになる。
=
演算子で左右のマッチングが取れれば、変数に対応する値を束縛(代入?参照?)する。
iex(1)> a=1
1
iex(2)> a
1
iex(3)> 1=a
1
iex(4)> a=2
2
iex(5)> 1=a
** (MatchError) no match of right hand side value: 2
リスト表記は [1,2,3]
のように書くらしい。リストの要素がリストでもあって良い。二次元配列ではない(要素ごとに任意の型?をおける)。
[[1,2,3],[4,5]]
iex(6)> [[1,2,3],[4,5]]
[[1, 2, 3], [4, 5]]
iex(7)> [_,a]=[[1,2,3],[4,5]]
[[1, 2, 3], [4, 5]]
iex(8)> a
[4, 5]
ここで _
は、マッチングさせるために使うけれども、あとで参照しないような場合に用いる変数である。要は捨てたい場合に使うもの?(通常の変数に比べると高速になるのかもしれない)。
一つの式に現れる変数は、最初にマッチングした値とマッチする必要がある。
iex(1)> [a,a] = [1,1,1]
** (MatchError) no match of right hand side value: [1, 1, 1]
iex(1)> [a,a] = [1,1]
[1, 1]
iex(2)> [a,a] = [1,2]
** (MatchError) no match of right hand side value: [1, 2]
最初のマッチではなく、すでに束縛した値をマッチングに使う場合は ^
を変数の頭につける
iex(1)> a=1
1
iex(2)> ^a=1
1
iex(3)> ^a=2
** (MatchError) no match of right hand side value: 2
これはなぜだめなのかな...
iex(4)> 1=^a
** (CompileError) iex:4: cannot use ^a outside of match clauses
TODO: あとでしらべる