【问题标题】:How to match on non-existing key of map in function head如何在功能头中匹配不存在的地图键
【发布时间】:2015-05-15 05:07:18
【问题描述】:

我有一个函数,它维护一些值作为其递归的状态,为了灵活地处理其参数的顺序,我使用Map 来存储状态并在调用之间传递它。

我的基本情况是函数在没有socket 的情况下被调用,因此应该存在只完成该设置的情况。但是,我找不到匹配 Map 的不存在键的方法。

尝试:

def measure(args = %{socket: nil}) ...

def measure(args = %{socket: socket}) when not is_port(socket) ...

但是,这些模式仅在存在socket(即 nil/不是端口)时匹配。

有没有办法指定匹配不存在的键的模式?还是我必须创建另一个 entry 函数来为我的地图提供默认值?

【问题讨论】:

    标签: pattern-matching elixir


    【解决方案1】:

    在 Elixir 版本 1.10.0 中引入了一个名为 is_map_key (https://hexdocs.pm/elixir/Kernel.html#is_map_key/2) 的新守卫

    您现在可以处理地图中不存在的键,例如:

    def measure(args) when not is_map_key(args, :socket) do
      handle_without_socket(args)
    end
    
    def measure(args = %{socket: socket}) do
      handle_socket(socket, args)
    end
    

    【讨论】:

      【解决方案2】:

      您需要一个匹配任何值的子句,然后在后面添加另一个子句:

      def measure(args = %{socket: socket}) do
        handle_socket(socket, args)
      end
      
      def measure(args) do
        handle_without_socket(args)
      end
      

      一般来说,使用地图的首选方式是通过严格的语法。您只需匹配:socket 或调用args.socket,如果套接字不可用作密钥,它将失败。

      如果您要传递可选数据,也许您想使用关键字列表而不是地图。

      【讨论】:

      • 谢谢!你能给我一个在函数头中使用严格语法的简短例子吗?比如,你帖子中的第一个定义会是这样吗?
      • 严格的语法正是我上面写的,没有后备子句。您正在匹配密钥,就是这样。在模式/守卫之外使用map.field
      猜你喜欢
      • 2022-12-01
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      相关资源
      最近更新 更多