首页 > 解决方案 > 使用 cons 运算符“|” 带有关键字列表

问题描述

我正在尝试定义一个函数,在其中指定关键字列表的一部分,然后将剩余的 opts 匹配为尾部。

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

由于关键字是元组列表的语义糖,我不清楚为什么后一种语法有效,但不是前者。我是否缺少一些可以|与关键字一起使用的语法?

标签: elixir

解决方案


发生这种情况是因为关键字列表语法在列表的上下文中有效,这意味着此类语法无效:

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

推荐阅读