JavaScriptを有効にしてください

【Elixir】clauses with the same name and arity の意味と対処方法

 ·  ☕ 1 分で読めます

【Elixir】clauses with the same name and arity の意味と対処方法

warning: clauses with the same name and arity (number of arguments) should be grouped together が出た際の対処方法。

エラーメッセージ

warning: clauses with the same name and arity (number of arguments) should be grouped together, "def handle_event/3" was previously defined

このメッセージは、handle_event/3関数がまとめられていないという意味になります。

解決策

ステップ1: 関数の定義を確認

まずは関数の定義を確認してください。
以下のように同一関数名が別々の位置にあるかと思います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def handle_event("refresh", _params, socket) do
  # イベント "refresh" の処理
  refresh()
  {:noreply, update(socket, :page, &(&1 + 1))}
end

def refresh() do
    # リフレッシュで使用する関数
end

def handle_event("load_more", _params, socket) do
  # イベント "load_more" の処理
  {:noreply, update(socket, :items, fn items -> List.concat(items, additional_items()) end)}
end

ステップ2: 関数を再編成

2つの対処方法があります。

同一関数名でまとめる場合。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 同一関数名でまとめる
def handle_event("refresh", _params, socket) do
  # イベント "refresh" の処理
  refresh()
  {:noreply, update(socket, :page, &(&1 + 1))}
end

def handle_event("load_more", _params, socket) do
  # イベント "load_more" の処理
  {:noreply, update(socket, :items, fn items -> List.concat(items, additional_items()) end)}
end

def refresh() do
    # リフレッシュで使用する関数
end

関数を1つにまとめて、パターンマッチングを使用して分岐を管理。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def handle_event(event_type, _params, socket) do
  case event_type do
    "refresh" ->
       refresh() 
      {:noreply, update(socket, :page, &(&1 + 1))}

    "load_more" ->
      {:noreply, update(socket, :items, fn items -> List.concat(items, additional_items()) end)}
  end
end

これでこの warning に対応できます。

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer