2017-01-31 8 views
4

は、私はこのようなFooモジュールを定義している:私はFoo.hello(%{name: "Alice"})を実行する場合Elixirの関数パラメータ内の等号とは何ですか?

defmodule Foo do 
    def hello(x = %{name: name}) do 
    IO.inspect [x, name] 
    end 
end 

が、私は次のような結果を得る:次に

[%{name: "Alice"}, "Alice"] 

を、私は変更せずにFooモジュールを書き換えることができることを学びましたこのような機能:

defmodule Foo do 
    def hello(%{name: name} = x) do 
    IO.inspect [x, name] 
    end 
end 

なぜこれが可能ですか?関数パラメータ内の等号とは何ですか?それは正常なマッチ演算子ですか?

私の理解では、オペレータ=は、左側のパターンと右側の値を一致させます。

[編集]

ジャスティンの答えを読んだ後、私は自分自身で答えを投稿しました。しかし、私はまだ助けが必要です。

=オペレータが機能ヘッド内で異なる動作をしているかどうか、またその理由を知りたいと思います。

利用可能な場合は、公式のマニュアルを探したいと思います。

答えて

2

実際には依然としてマッチ演算子です。あなたがこれを行うことができます

理由は、あなたがあなたの関数の頭の中にこの

iex(1)> 1 = x 

** (CompileError) iex:3: undefined function x/0 
iex(2)> x = 1 
1 
iex(3)> 1 = x 
1 

のように一致させることができ、同様の理由で、xは(同じとすぐに機能を使用して、それに引数を渡すとしての価値を持っていますなぜなら、関数をdef hello(x) do ... endと定義できるからです。つまり、マッチ演算子の右側でそれを使用することができます。

+0

ありがとうございました。しかし、2番目の 'Foo'モジュールでは、なぜ与えられた引数が最初に' x'に結びついているのですか?これは 'x'が演算子' = 'の右側にあるからですか?私はまだ、関数のパラメータへの値のバインディングのメカニズム全体を確信していません。 – Tsutomu

+1

'x'は、関数が左辺か右辺かに関わらず、何かを渡すとすぐに値を持ちます。私が言ったように、あなたが 'hello(x)do ... end'を行うときと変わりはありません。 「トップレベル」の変数は、関数に渡すものに割り当てられます。 –

0

しばらくの間、グーグルした後、私はhttp://learnyousomeerlang.com/syntax-in-functionsについて説明しました。

この記事はアーランのfuction参照:

valid_time({Date = {Y,M,D}, Time = {H,Min,S}}) -> 
    io:format("The Date tuple (~p) says today is: ~p/~p/~p,~n",[Date,Y,M,D]), 
    io:format("The time tuple (~p) indicates: ~p:~p:~p.~n", [Time,H,Min,S]); 

をそれからそれは言う:機能ヘッドに=演算子を使用することが可能であることを

注意を、私たちは両方に一致することができますタプルの内容({Y,M,D})とタプル全体(Date)です。

それはおよそアーランですが、メカニズムがエリクサーで同じであるようです。実験では

次のように、私はFooモジュールを書き直し:

defmodule Foo do 
    def hello(%{name: x} = %{name: y}) do 
    IO.inspect [x, y] 
    end 
end 

は、その後、私はFoo.hello(%{name: "Alice"})を走っており、この得た:引数のパターンマッチングは、二つのパターンに対して行われ

["Alice", "Alice"] 

の両方=オペレータのの両側。

+1

この回答は参考になるはずです:http://stackoverflow.com/a/36184075/3741729 – PatNowak

関連する問題