2016-06-23 20 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」は、マップオブジェクトそのものを参照しているが、私はこれがどのように機能するかについての好奇心だと思われます。議論としてそれを渡しているのですが、私は文書でこれを調べましたが、これがまさに何が起こっていたのかを知ることはできませんでした。もし誰かが私が正確に何が起こっているのか、そして& 1が何を指しているのかを理解するのを助けることができたら、私は感謝しています。

+1

これは 'fn x - > MapSet.put(x、item)end'に相当します。私はStackOverflowにこれに関する既存の質問があると確信していますが、私はそれを見つけることができません。 – Dogbert

+0

私の質問はこの場合のxです。 – cogle

答えて

4

の古い状態であると言うことができますこれは可能です。

は、現在の状態で指定された関数を呼び出し、その戻り値を新しい状態として格納します。 &MapSet.put(&1, item)fn x -> MapSet.put(x, item) endと同じであるため、ここではxが古い状態になり、MapSet.put/2によって返された新しいMapSetがエージェントの新しい状態になります。関数にこのコード

name: __MODULE__Agent.start又はAgent.start_linkへの呼び出しとmap_setコードにおける任意MapSetどこか{:ok, map_set}を返す関数が存在しなければなりません。

+0

ありがとう、それははるかに明確になります。 – cogle

5

Enum.map

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

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

たちは基本的にリストして匿名関数を渡している、もっと簡単な例を考えてみましょう。 Enum.mapは、匿名関数が少なくとも1つの引数を持つことを期待しています(ブレーンナはなく、リストの各要素を匿名関数に渡します)。だから&1は、無名関数を呼び出すときにEnum.mapによって設定される無名関数の最初の引数です。 Enum.mapは、私たちのリストの別の要素で毎回無名関数を呼び出すリストをループします。私はAgent.updateの実装を知らないが、私の知る限り見るようにそのやっが何であるか、Agent.update_MODULE_あるとの古い状態を受け取り、この適用ファンクションMap.Set上のエージェントに呼びかけているが

エージェントの新しい状態を設定します。言い換えれば、あなたは&1は、誰かが私はそれがどのようにマップセットを参照している場合を指し、まさに起こっているとどのような& 1理解するのに役立つことができれば、私は感謝されるエージェント

+0

地図のために、私はそれが1と2のように繰り返されることを知っています。しかし、私たちはputを扱っています。 @Dogbertは、コードは 'fn x - > MapSet.put(x、item)end'のように表現できると言っていますが、最初は混乱しませんでした。むしろ、この場合、 'x'は何かについて混乱していました。もし' x'がMapSetオブジェクトであれば、 '&1'を通してどのように参照を取得していますか?私はその質問ではっきりしていたはずです。 – cogle

11

&1は、この関数の最初の引数です。 &表記は、基本的に匿名関数を表現するための別の方法です。EnumまたはAgentに固有の何もありません。のは、この例を見てみましょう:

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

これは、3つの引数を取り第一および第三の1を加え2つ目で結果を乗算匿名関数です。引数が行くだろう式のプレースホルダとして&1&2&3

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

思う:&表記付き。それが何であれ - だから、あなたはその引数とアイテムとMapSet.putを呼び出す1引数の機能を持つAgent.updateを呼んでいる

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

を行うとき。

+2

これは、受け入れられた答え、おかげでトンよりはるかに明確だと思います! –

関連する問題