给出一个函数:
foo 1, b: 2
我可以这样调用这个函数:
b: 2
我知道[b: 2]
与iex(1) a: 2, b: 2
** (SyntaxError) iex:1: syntax error before: a
相同,
但我不能在iex中这样做,例如:
$attachments = [
'text' => "Active codebases: (total = $total)",
'attachments' => [
[
'color' => '#3333ff',
'fields' => [
]
]
]
];
所以我想知道,为什么函数参数中的关键字列表是 不同?
答案 0 :(得分:3)
TL; DR 这是一个语法分析器要求,函数调用中有一个语法糖,让我们省略括号。 Keyword
本身也是一样。
关键字列表本身是相同的。但是Elixir语法分析器必须理解你做这个工作的意图。对于函数调用,它添加了一个语法糖,允许你省略关键字参数的括号,如果且只是没有不明确的含义:
foo(a: 42, b: :hello)
适用于:
def foo(opts \\ []), do: opts
但下面的代码段不起作用:
a = a: 42, b: :hello
在行的开头,在模式匹配和/或赋值中,语法分析器需要括号来理解Keyword
终止的位置。