所以我理解的捕獲運營商在這方面:爲什麼通過捕獲操作符在Elixir 1.4.2中調用代理#更新?
sum_it = &(&1 + 2)
sum_it.(1) # result is 3
但我不明白這裏吧:
# stores "Peter" where pid = #PID<0.82.0>
Agent.update(pid, &["Peter" | &1])
它看起來像它的轉向列表爲匿名函數?而「& 1」以某種方式代表了列表的尾部?
所以我理解的捕獲運營商在這方面:爲什麼通過捕獲操作符在Elixir 1.4.2中調用代理#更新?
sum_it = &(&1 + 2)
sum_it.(1) # result is 3
但我不明白這裏吧:
# stores "Peter" where pid = #PID<0.82.0>
Agent.update(pid, &["Peter" | &1])
它看起來像它的轉向列表爲匿名函數?而「& 1」以某種方式代表了列表的尾部?
Agent.update/3執行代理的state
並返回新的state
的功能。
所以,如果我需要一些Agent
iex(1)> {:ok, pid} = Agent.start(fn -> 4 end)
{:ok, #PID<0.90.0>}
iex(2)> pid
#PID<0.90.0>
iex(3)> Agent.update(pid, &(&1 + 2))
:ok
iex(4)> Agent.get(pid, &(&1))
現在,當你在質疑的語法。
iex(1)> [1, 2, 3]
[1, 2, 3]
iex(2)> [1 | [2 | [3]]]
[1, 2, 3]
本質上它是一種將值預先加到當前列表的方法。
iex(3)> [1, 2 | 3]
[1, 2 | 3]
使用|
當創建一個列表,您將需要小心。你會希望確定你已經有一個列表,因爲你可以創建一個不正確的列表,如果你不期望的話可能會意外地導致一些問題。
捕獲運算符是一個語法糖/速記,用於聲明最小體積1的匿名函數。Kernel.SpecialForms.&
只需要它的參數,查找其中的所有&N
並將整個轉換爲匿名函數。最有代表性的例子是:
iex(1)> f = &(&1)
#Function<6.50752066/1 in :erl_eval.expr/5>
iex(2)> f.(42)
42
Elixir以一種自由的方式處理空間(不像Python :)。如果沒有歧義,空格將被忽略。有人可能會寫f = &(&1)
或f = & &1
或f =& &1
,以上所有都是等效的。如果沒有歧義,可能會被忽略的空間:
iex(3)> sum_it = &[&1 | 42]
#Function<6.50752066/1 in :erl_eval.expr/5>
iex(4)> sum_it.(3.14)
[3.14 | 42]
以上是基本相同sum_it = &([&1 | 42])
。也就是說,以上是一個語法糖:
iex(5)> sum_it = fn arg1 -> [arg1 | 42] end
希望澄清事情。