如何匹配函数头中不存在的映射键

iSt*_*efo 4 elixir pattern-matching

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

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

尝试:

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

def measure(args = %{socket: socket}) when not is_port(socket) ...
Run Code Online (Sandbox Code Playgroud)

然而,当这些模式只匹配存在的一个关键socketnil/不是一个端口。

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

ala*_*ama 8

Elixir 版本 1.10.0 引入了一个新的守卫,称为is_map_keyhttps://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
Run Code Online (Sandbox Code Playgroud)


Jos*_*lim 5

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

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

def measure(args) do
  handle_without_socket(args)
end
Run Code Online (Sandbox Code Playgroud)

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

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