2016-06-23 35 views
3

我無法理解以下上下文中的'&'運算符。'&'運算符是如何工作的?

@doc "Marks a task as executed" 
    def put_task(task, project) do 
    item = {task, project} 
    Agent.update(__MODULE__, &MapSet.put(&1, item)) 
    end 

看來,在這種情況下,「& 1」指的是地圖對象本身,但我很好奇,是如何工作的。它是否作爲參數傳遞給我,我在文檔中查看了這一點,但無法確定這是否正是發生的事情。如果有人能幫助我瞭解到底發生了什麼以及如何引用MapSet,這將如何實現,我將不勝感激。

+1

這相當於'fn x - > MapSet.put(x,item)end'。我確信在StackOverflow中存在一個關於此的問題,但我似乎無法找到它。 – Dogbert

+0

我的問題是在這種情況下x是什麼。 – cogle

回答

4

我會很感激的老態,如果有人可以幫助我瞭解究竟是什麼回事,什麼& 1指的是,如果它是指地圖集如何這可能。

Agent.update/3用當前狀態調用給定函數,並將返回的值作爲新狀態存儲。由於&MapSet.put(&1, item)fn x -> MapSet.put(x, item) end相同,因此x成爲舊狀態,並且由MapSet.put/2返回的新MapSet成爲代理的新狀態。

爲使該代碼的功能,必須有Agent.startAgent.start_linkname: __MODULE__打個電話,返回{:ok, map_set}其中map_set任何MapSet某處代碼的功能。

+0

謝謝,這使得它更清晰。 – cogle

5

讓我們考慮一個更簡單的例子,

Enum.map [1, 2, 3, 4], &(&1 * 2) 

Enum.map [1, 2, 3, 5], fn x -> x * 2 end // Exactly like above 

Enum.map我們基本上傳遞一個列表和一個匿名函數。 Enum.map期望匿名函數擁有至少一個參數(沒有必要,它將列表中的每個元素傳遞給匿名函數)。所以這裏&1這是匿名函數的第一個參數,它將在調用我們的匿名函數時由Enum.map設置。 Enum.map通過列表循環調用我們的匿名函數,每次都使用我們列表的不同元素。

雖然我不知道Agent.update的實施,但據我看到它做的是什麼,Agent.update呼籲這是_MODULE_和接收的舊州這個應用功能Map.Set代理代理,並設置代理的新狀態。換句話說,你可以說&1是代理

+0

因此,對於地圖來說,它對我來說更有意義,我知道它會通過1和2等循環。但上面我們正在處理put。 @Dogbert說,代碼可以表達爲'fn x - > MapSet.put(x,item)end',這一點我一開始並不感到困惑;相反,在這種情況下我很困惑什麼是'x',如果'x'是MapSet對象,它是如何通過'&1'得到這個引用的。我應該在問題上更清楚。 – cogle

11

&1是函數的第一個參數。整個&表示法基本上是表示匿名函數的一種替代方式 - 關於它的EnumAgent沒有任何特定的表示方法。讓我們以這個例子:

fn (x, y, z) -> (x + z) * y end 

這是一個匿名函數,有3個參數,增加了第一和第三個和乘以第二個結果。隨着&符號:

&((&1 + &3) * &2) 

&1&2&3作爲表達式參數在哪裏去佔位符的思考。所以,當你做

Agent.update(__MODULE__, &MapSet.put(&1, item)) 

你打電話Agent.update與調用MapSet.put這樣的說法和項目帶有一個參數的函數 - 不管它是什麼。

+2

我覺得這比接受的答案要清楚得多,謝謝! –

相關問題