LoginSignup
3
1

More than 5 years have passed since last update.

プログラミング Elixir 第二章

Last updated at Posted at 2016-09-04

概要

プログラミング 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

以上!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1