【问题标题】:Pattern match on value of Map's key in elixir长生不老药中地图键值的模式匹配
【发布时间】:2016-10-19 05:24:50
【问题描述】:

我想对映射中键的值进行模式匹配

  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

当我发送%{"message" =&gt; "hello", "name" =&gt; "x"} 的有效负载时,会发生该错误,或​​者对于任何其他消息。

【问题讨论】:

    标签: elixir


    【解决方案1】:

    您的密钥是"message" 而不是:message。使用:payload["message"]

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

    您也可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2018-11-24
      • 2014-03-16
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多