Symfoware

Symfowareについての考察blog

elixir入門 4.Pattern matching

elixir入門 3.Basic operators(演算子)
この続きです。

今回は、この章を試してみます。
Pattern matching



The match operator



「=」は、代入演算子としての役割があります。
例えば、変数xに1を代入。


iex(1)> x = 1
1
iex(2)> x
1




代入演算子としての役割とは別に、マッチ演算子としても機能します。


iex(3)> 1 = x
1
iex(4)> 2 = x
** (MatchError) no match of right hand side value: 1
    
iex(4)> 1 = unknown
** (RuntimeError) undefined function: unknown/0




このへん、Erlangを書いたことがないとちょっとイメージしにくいかも。






Pattern matching



タプル内の変数を取り出す方法として、このマッチ演算子を使用する方法があります。


iex(4)> {a, b, c} = {:hello, "world", 42}
{:hello, "world", 42}
iex(5)> a
:hello
iex(6)> b
"world"
iex(7)> c
42




a, b, cそれぞれの変数に、右辺のタプルの内容が代入されました。
タプル内の変数の数が異なるとエラーになります。
また、左辺がタプル、右辺がリストの場合もエラーになります。


iex(8)> {a, b, c} = {:hello, "world"}
** (MatchError) no match of right hand side value: {:hello, "world"}
    
iex(8)> {a, b, c} = [:hello, "world", "!"]
** (MatchError) no match of right hand side value: [:hello, "world", "!"]





左辺のタプルに、Atom等の変数以外の値が含まれている場合、マッチ演算子は威力を発揮します。


iex(8)> {:ok, result} = {:ok, 13}
{:ok, 13}
iex(9)> result
13
iex(10)> {:ok, result} = {:error, 13}
** (MatchError) no match of right hand side value: {:error, 13}




この機能を使用すると、処理結果が:okの場合と:errorの場合の分岐が
簡単に記述できるようになります。


リスト同士でもマッチ演算子は使用できます。


iex(10)> [a, b, c] = [1, 2, 3]
[1, 2, 3]





「|」を使用すると、リストの先頭とそれ以外を簡単に分割できます。


iex(12)> [head | tail] = [1, 2, 3]
[1, 2, 3]
iex(13)> head
1
iex(14)> tail
[2, 3]




空のリストを渡すとエラーになります。


iex(15)> [head | tail] = []    
** (MatchError) no match of right hand side value: []




「|」は、リストの分割の他に、結合にも使用できます。
ただし、末尾への値の追加は行えません。


iex(15)> list = [1, 2, 3]
[1, 2, 3]
iex(16)> [0 | list]
[0, 1, 2, 3]
iex(17)> [list | 4]
[[1, 2, 3] | 4]






The pin operator



「=」演算子を値の代入ではなくマッチ演算子として使用したい場合、
ピン演算子「^」が便利です。


普通に値を代入する例。


iex(18)> x = 1
1
iex(19)> x = 2
2




xに代入した1とマッチを行いたい例。
左辺を数値とする場合と、左辺に変数をピン演算子付きで指定する場合。


iex(20)> x = 1
1
iex(21)> 2 = x
** (MatchError) no match of right hand side value: 1
    
iex(21)> ^x = 2
** (MatchError) no match of right hand side value: 2




以下の例は・・・まだ理解できていないです。


iex(21)> {x, ^x} = {2, 1}
{2, 1}





マッチ演算子を使うと、タプル内の変数が同じ値であるかのチェックも
簡単に行えます。


iex(23)> {x, x} = {1, 1}
{1, 1}
iex(24)> {x, x} = {1, 2}
** (MatchError) no match of right hand side value: {1, 2}





変数「_」には、「この変数の値に興味がない。なんにでもマッチする」という
特殊な意味があります。
興味がない値なので、内容の参照は行えません。


iex(24)> [h | _] = [1, 2, 3]
[1, 2, 3]
iex(25)> h
1
iex(26)> _
** (CompileError) iex:26: unbound variable _





関数の戻り値を左辺に置いてのマッチは行えないようです。


iex(26)> length([1,[2],3])
3
iex(27)> length([1,[2],3]) == 3
true
iex(28)> length([1,[2],3]) = 3
** (CompileError) iex:28: illegal pattern
    
iex(28)> 3 = length([1,[2],3])
3



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/07/26(日) 10:30:59|
  2. Erlang
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<elixirからMariaDBに接続する(Mariaex) | ホーム | elixir入門 3.Basic operators(演算子)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1764-67f3aeb1
この記事にトラックバックする(FC2ブログユーザー)