2017-01-31 44 views
4

我已經定義了一個Foo模塊是這樣的:Elixir中的函數參數中的等號是什麼?

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

如果我運行Foo.hello(%{name: "Alice"}),我得到以下結果:

[%{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

謝謝。但是,在第二個'Foo'模塊中,爲什麼給定的參數首先綁定到'x'?這是因爲'x'位於運算符'='的右側嗎?我還不確定價值綁定到函數參數的整個機制。 – Tsutomu

+1

只要你將某些東西傳遞給函數,無論是在左邊還是右邊,'x'都有一個值。就像我說過的那樣,和「你好(x)做...結束」這個時候沒有什麼不同。 「頂級」變量被分配給你傳遞給你函數的任何東西。 –

0

Google上搜尋了一段時間後,我發現http://learnyousomeerlang.com/syntax-in-functions的解釋。

本文所指的二郎功用:

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)內的內容。

這是關於厄蘭,但似乎Elixir機制是一樣的。

對於實驗,我改寫了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

相關問題