プログラミング Elixir 第二章


概要

プログラミング Elixir

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

以上!