プログラミングElixir第2章

第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: あとでしらべる