概要
Elixir の =
の扱いを解説している章。
他のプログラミング言語と違い、Elixir にとって =
はパターンマッチであり、代入という意味ではない。確かに、Elixir でも a = 1
と書いた場合は a に 1 がセットさせるが、これは代入ではなく、等号を成立させるために値を「束縛」した状態である。
あくまでもマッチを成立させるために値を「束縛」しているので、例えば [a, a] = [1, 2]
とすると同号に矛盾があるためエラーとなる。
つまり、Elixir では、=
を見た場合、一般的なプログラミング言語の代入という意味を忘れて、本来の代数の使われ方である等号を思い出す必要がある。
パターンマッチと束縛
左辺に変数を与えると値を束縛させることができる。
> a = 1
> a
#=> 1
矛盾さえなければ何度でも束縛し直すことができる。
> a = 1
> a = 2
> a
#=> 2
> [a, b] = [1, 2]
> a
#=> 1
> b
#=> 2
> [a, a] = [1, 2]
#=> ** (MatchError) no match of right hand side value: [1, 2]
変数を右辺に置くとパターンマッチ。
> a = 1
> 1 = a
#=> 1
> 2 = a
#=> ** (MatchError) no match of right hand side value: 1
> [1, 2] = [a, 2]
#=> [1, 2]
> [1, 3] = [a, 2]
#=> ** (MatchError) no match of right hand side value: [1, 2]
_
と ^
パターンマッチで番う特殊な記号。
_
(アンダースコア) は値の無視で使う。ただし、どんな値でも OK という意味なので、要素数は合わせる必要がある。
> [1, 2] = [1, 3]
#=> ** (MatchError) no match of right hand side value: [1, 3]
> [1, _] = [1, 3]
#=> [1, 3]
[1, _, _] = [1, 3]
#=> ** (MatchError) no match of right hand side value: [1, 3]
^
(キャレット) はピン演算子と呼ばれるもので、新たに束縛させずに、以前に束縛させた値でマッチさせたい時に使う。
> a = 1
> ^a = 2
#=> ** (MatchError) no match of right hand side value: 2
> a = 2
> ^a = 2
#=> 2
以上!