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)
然而,当这些模式只匹配存在的一个关键socket是nil/不是一个端口。
有没有办法指定与不存在的键匹配的模式?或者我是否必须创建另一个输入函数来为我的地图提供默认值?
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
Run Code Online (Sandbox Code Playgroud)
您需要一个匹配任何值的子句,并在后面添加另一个:
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,如果套接字不可用作键,它就会失败。
如果您正在传递可选数据,也许您想使用关键字列表而不是地图。