elixir - 使用 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
由于关键字是元组列表的语义糖,我不清楚为什么后一种语法有效,但不是前者。我是否缺少一些可以|
与关键字一起使用的语法?
解决方案
发生这种情况是因为关键字列表语法仅在列表的上下文中有效,这意味着此类语法无效:
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
推荐阅读
- reactjs - 渲染不同的组件 (yyy) 时无法更新组件 (xxx)
- serialization - NestJS Schema First GraphQL 序列化
- html - 如何修复 html css 样式问题?
- c++ - VS 代码、GCC(MinGW/WinLibs)、Win10:#include
-> "#include 检测到错误。请更新您的 IncludePath",但 #include "[abs path]" 没问题 - r - 是否有 R 函数可以在树状图中添加点?
- javascript - 在 html 表中使用 javascript umlaute (ä,ö,ü) 对表进行排序
- android - 使程序正常运行,无需下载新的 gradle
- ruby - Ruby 使用 CSV 标头创建查找表
- android - 为什么在尝试使用 Firbase 登录命令时出现意外错误
- java - Java:按属性值过滤2个不同对象的集合