如何解决使用 cons 运算符“|”带有关键字列表
我正在尝试定义一个函数,在其中指定关键字列表的一部分,然后将剩余的选项作为尾部进行匹配。
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)
这个想法是让 baz
成为一个包含 [another_arg: 11,even_more_args: 12] 的关键字列表
这不会编译,失败并出现以下错误:
错位的运算符 |/2
|运算符通常在方括号之间用作 cons 运算符:
[头|尾巴]
但是,我可以使用以下方法对关键字列表进行模式匹配:
def my_func([{:foo,22},{:bar,42} | baz]) do
end
由于关键字是元组列表的语义糖,我不清楚为什么后一种语法有效,而前者无效。是否缺少一些语法,无法将 |
与关键字一起使用?
解决方法
发生这种情况是因为关键字列表语法仅在列表上下文中有效,这意味着此类语法无效:
iex> test = foo: 22
** (SyntaxError) iex:8:8: syntax error before: foo
但这是有效的:
iex> test = [foo: 22]
[foo: 22]
def my_func([[foo: 22],[bar: 42] | baz]) do
end
当然前面的语法是不合适的,因为它会产生嵌套列表,但是没有列表你不能使用关键字,所以你必须明确地把它写成一个元组。
我推荐的是使用 ++/2
运算符:
def my_func([foo: 22,bar: 42] ++ rest) do
IO.inspect(rest)
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。