【问题标题】:How can I pattern match in a function where a Map has a key with the passed in value?如何在 Map 具有带有传入值的键的函数中进行模式匹配?
【发布时间】:2025-11-27 23:10:01
【问题描述】:

所以我正在创建一个 IRC 服务器,并且我有一个从地图中删除用户的功能。这个想法是使用模式匹配,所以如果用户在地图中,则调用一个函数版本,否则调用另一个函数。

我的第一个想法是做以下事情:

remove_user_from_channel(User, Channel=#channel_details{users = UserMap=#{User := _}}) ->
  Channel#channel_details{users = maps:remove(User, UserMap)}.

但是,编译失败,错误为variable 'User' is unbound

有没有什么方法可以通过函数级模式匹配来实现这一点?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    您不能在函数头中对映射键进行模式匹配,但可以在 case 中进行:

    remove_user_from_channel(User, Map) ->
      case Map of
        Channel = #channel_details{users = UserMap = #{User := _}} ->
          Channel#channel_details{users = maps:remove(User, UserMap)};
        _ ->
          other
       end.
    

    【讨论】:

      【解决方案2】:
      remove_user_from_channel(User, Channel=#channel_details{users = UserMap}) ->
          case maps:is_key(User, UserMap) of
              true -> Channel#channel_details{users = maps:remove(User, UserMap)};
              false -> ok
          end.
      

      我认为你不能在函数级别使用匹配模式,但你可以使用is_key(Key, Map) -> boolean() 来检查User 是否在UserMap 中。 链接在这里: http://erlang.org/doc/man/maps.html#is_key-2

      【讨论】: