我试图定义一个函数,在其中指定关键字列表的一部分,然后将剩余的选项作为尾部进行匹配。
def my_func(foo: 22, bar: 42 | baz) do
IO.inspect(baz)
end
my_func(foo: 22, bar: 42, another_arg: 11, even_more_args: 12)
Run Code Online (Sandbox Code Playgroud)
这个想法是baz成为一个包含 [another_arg: 11, Even_more_args: 12] 的关键字列表
这无法编译,失败并出现以下错误:
错位的运算符 |/2
| 的 | 运算符通常在括号之间用作 cons 运算符:
[头| 尾巴]
但是,我可以使用以下命令对关键字列表进行模式匹配:
def my_func([{:foo, 22}, {:bar, 42} | baz]) do
end
Run Code Online (Sandbox Code Playgroud)
由于关键字是元组列表的语义糖,因此我不清楚为什么后者语法有效,但前者无效。我是否缺少一些能够|与关键字一起使用的语法?
发生这种情况是因为关键字列表语法仅在列表上下文中有效,这意味着此类语法无效:
iex> test = foo: 22
** (SyntaxError) iex:8:8: syntax error before: foo
Run Code Online (Sandbox Code Playgroud)
但这是有效的:
iex> test = [foo: 22]
[foo: 22]
def my_func([[foo: 22], [bar: 42] | baz]) do
end
Run Code Online (Sandbox Code Playgroud)
当然,前面的语法不合适,因为它会生成嵌套列表,但是您不能在没有列表的情况下使用关键字,因此您必须将其显式编写为元组。
我建议使用++/2运算符:
def my_func([foo: 22, bar: 42] ++ rest) do
IO.inspect(rest)
end
Run Code Online (Sandbox Code Playgroud)