5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Elixir パターンマッチと関数パターンマッチ

Last updated at Posted at 2024-11-10

こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はパターンマッチと関数パターンマッチの違いについて学んだことをまとめます。

目次

1.パターンマッチと関数パターンマッチ(本記事)
2.関数パターンマッチ+ガード節

目的

パターンマッチと関数パターンマッチの違いを理解する

実行環境

Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0

パターンマッチとは

=(マッチ演算子)を使うことで右辺を左辺に束縛すること

右辺の1, 2, 3を左辺の変数a, b, cにそれぞれ束縛します

iex
[a, b, c] = [1, 2, 3]
[1, 2, 3]

左辺と右辺を入れ替えるとパターンマッチが行われます。
この場合右辺の変数a, b, cにはそれぞれ1, 2, 3が束縛されているため、[1, 2, 3] = [1, 2, 3]のパターンマッチを行っています

iex
[1, 2, 3] = [a, b, c]
[1, 2, 3]

要素単独でのパターンマッチも同様です

iex
3 = c
3

変数a, b, cに束縛された値と異なる値でパターンマッチをしようとするとマッチエラーが発生します

iex
[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)

要素単独でのパターンマッチも同様です

iex
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プロジェクトを作っておきます

bash
mix new func_matching
cd func_matching

テストの追加

test/func_matching_test.exs
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

関数の追加

lib/func_matching.ex
defmodule FuncMatching do
  def countelems([]) do
    "空のリストです"
  end

  def countelems([_]) do
    "リストの要素数は1です"
  end

  def countelems(_) do # 上記のいずれにもマッチしなかった場合
    "リストの要素数は2以上であるか、そもそもリストではありません"
  end
end

~Elixirの国のご案内~

↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。

We Are The Alchemists, my friends!:bouquet:1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2

  1. @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。

  2. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

5
0
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
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?