2016-09-22 54 views
0

给出一个函数:药剂关键字列表

def foo(a, opts \\ []), do: opts 

我可以调用这个函数是这样的:

foo 1, b: 2 

我知道b: 2是一样的[b: 2], 但我不能在iex中做到这一点,如:

iex(1) a: 2, b: 2 
** (SyntaxError) iex:1: syntax error before: a 

所以我想知道,为什么函数的参数中的关键字列表是 不同?

回答

1

TL; DR这是一个语法分析器要求,在函数调用中有一个语法糖,可以省略括号。 Keyword s本身是一样的。


关键字列表本身是相同的。但Elixir语法分析器必须理解你的意图来完成它的工作。对于函数调用,它增加了一个语法糖,让你忽略括号关键字参数,当且仅存在什么意思没有不确定性:

foo(a: 42, b: :hello) 

将工作:

def foo(opts \\ []), do: opts 

但下面的代码片段将无法正常工作:

a = a: 42, b: :hello 

在该行的开始,在模式匹配和/或转让,语法分析器需要括号了解,其中Keyword已终止。