Pattern match on value of Map's key in elixir

∥☆過路亽.° 提交于 2019-12-11 08:11:31

问题


I want to pattern match on the value of a key in a map

  def handle_in("new_message", payload, socket) do
    case payload.message do
      "hello" -> broadcast! socket, "new_message", payload
    end

    {:noreply, socket}
  end

[error] GenServer #PID<0.378.0> terminating ** (KeyError) key :message not found in: %{"message" => "hello", "name" => "x"} (chatroom) web/channels/lobby_channel.ex:9: Chatroom.LobbyChannel.handle_in/3 (phoenix) lib/phoenix/channel/server.ex:226: anonymous fn/4 in Phoenix.Channel.Server.handle_info/2 (stdlib) gen_server.erl:601: :gen_server.try_dispatch/4 (stdlib) gen_server.erl:667: :gen_server.handle_msg/5

when I send the payload of %{"message" => "hello", "name" => "x"}, that error happens, or for any other message.


回答1:


Your key here is "message" not :message. Use: payload["message"]

  def handle_in("new_message", payload, socket) do
    case payload["message"] do
      "hello" -> broadcast! socket, "new_message", payload
    end

    {:noreply, socket}
  end

You can also do this:

  def handle_in("new_message", %{"message" => message}, socket) do
    case message do
      # ...
  end


来源:https://stackoverflow.com/questions/40118252/pattern-match-on-value-of-maps-key-in-elixir

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!