こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はパターンマッチと関数パターンマッチの違いについて学んだことをまとめます。
目次
1.パターンマッチと関数パターンマッチ(本記事)
2.関数パターンマッチ+ガード節
目的
パターンマッチと関数パターンマッチの違いを理解する
実行環境
Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0
パターンマッチとは
=
(マッチ演算子)を使うことで右辺を左辺に束縛すること
例
右辺の1, 2, 3を左辺の変数a, b, cにそれぞれ束縛します
[a, b, c] = [1, 2, 3]
[1, 2, 3]
左辺と右辺を入れ替えるとパターンマッチが行われます。
この場合右辺の変数a, b, cにはそれぞれ1, 2, 3が束縛されているため、[1, 2, 3] = [1, 2, 3]のパターンマッチを行っています
[1, 2, 3] = [a, b, c]
[1, 2, 3]
要素単独でのパターンマッチも同様です
3 = c
3
変数a, b, cに束縛された値と異なる値でパターンマッチをしようとするとマッチエラーが発生します
[1, 20, 3] = [a, b, c]
** (MatchError) no match of right hand side value: [1, 2, 3]
(stdlib 6.0) erl_eval.erl:652: :erl_eval.expr/6
iex:10: (file)
要素単独でのパターンマッチも同様です
10 = a
** (MatchError) no match of right hand side value: 1
(stdlib 6.0) erl_eval.erl:652: :erl_eval.expr/6
iex:13: (file)
関数パターンマッチとは
同一関数名の引数違いでパターンマッチを行うこと
例
前提
下記でElixirプロジェクトを作っておきます
mix new func_matching
cd func_matching
テストの追加
describe "check list elements" do
test "when list is []" do
assert FuncMatching.checkelems([]) == "空のリストです"
end
test "when list has only one element" do
assert FuncMatching.checkelems([5]) == "リストの要素数は1です"
end
test "other pattern" do
assert FuncMatching.checkelems([1, 2, 3]) == "リストの要素数は2以上であるか、そもそもリストではありません"
end
test "when argument is not a list" do
assert FuncMatching.checkelems("hoge") == "リストの要素数は2以上であるか、そもそもリストではありません"
end
end
関数の追加
defmodule FuncMatching do
def countelems([]) do
"空のリストです"
end
def countelems([_]) do
"リストの要素数は1です"
end
def countelems(_) do # 上記のいずれにもマッチしなかった場合
"リストの要素数は2以上であるか、そもそもリストではありません"
end
end
~Elixirの国のご案内~
↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます
↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。
↓We Are The Alchemists, my friends!1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2
-
@torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。 ↩