2012-12-04 107 views
14

下劃線變量和從Erlang編譯器的角度以下劃線開頭的命名變量(除了向代碼添加可讀性之外)有什麼區別?Erlang中的匿名變量

例如__Var有什麼不同?

回答

20

不在乎變量_非常特殊的變量,它匹配任何東西,是NEVER綁定到一個值。當我知道那裏有東西的時候會用到它,但我不在乎它的價值是什麼,我永遠不會使用它。看到_永遠不會被束縛,它不能在表達式中使用,編譯器將其標記爲錯誤。

_Var這樣的變量是完全正常的變量,您可以匹配並將其綁定到值,這意味着它們可以在表達式中使用。用_前綴變量大約是意圖。編譯器通常會警告你一個綁定在模式中但從未使用的變量,通常是錯誤的標誌。但是,編譯器不會提供以_爲前綴的變量,如_Var。目的是爲了給這個變量命名,命名是好的,但是我知道我永遠不會使用它。

請記住,_實際上是唯一的特殊變量,而_Var是正常變量,如果使用,則表現如此。如果你感覺不正常,那麼你可以用_加上所有變量的前綴,所有東西都可以工作。

+0

謝謝!這是一個答案。:-) – coffeMug

18

讓我們報價doc這裏:

匿名變量是由下劃線(_),並表示可用於 需要變量時,但其值可以忽略不計。 [...]

開始下劃線(_),例如_Height變量,都是正常的變量,而不是匿名:然而,它們由編譯器在這個意義上,他們將不會產生未使用的變量任何警告忽略

換句話說,你用_Var形式,當你需要匹配的表達式匹配 - 但不想使用它進一步和/或你想要顯示它的意義。當你和編譯器都不應該關心將被它匹配的表達式時,你使用變量_

例1:

member(_, []) -> []. 

在此功能是不太清楚是什麼第一_比賽。而是直接改寫它,就像這樣:

member(Elem, []) -> []. 

...會產生警告,如果代碼與標誌warn_unused_vars集編譯。你仍然可以使你的代碼可讀性在這裏,雖然,通過使用下劃線的變量:

member(_Elem, []) -> []. 

例2:

{_, _, Some} = {1, 2, 3} 

這個元組匹配會雖然是很沒事,因爲前兩個元素的元組將被完全忽略。

{_Var, _Var, Some} = {1, 2, 3} 

這種匹配會失敗,不過,:儘管_Var不會有被使用,它應該是「填滿」具有相同的價值!由於1不等於2,因此這裏的條件失敗。

+0

好的,但有沒有什麼理由不使用這種變量,他們的名字以下劃線開頭? – coffeMug

+0

@AKh_Sw因爲大多數人都希望編譯器警告未使用的變量,所以它存在。 –

+1

@AKh_Sw正如響應結束時解釋的(例子2),它可能會產生不匹配。想象一下你有一個複雜的代碼,在重構之後,你決定取消使用一個以前使用的變量,但是這個變量在這個複雜的代碼中發生了好幾次。你只是把_不使用它,但它實際上被使用。那麼你可能會有意想不到的不匹配。 此外,需要使用這些下劃線變量來記錄代碼有時被認爲是一種「代碼味道」和簡化它的邀請。 –