2016-09-22 81 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已終止。