回答
的不在乎變量_
是非常特殊的變量,它匹配任何東西,是NEVER綁定到一個值。當我知道那裏有東西的時候會用到它,但我不在乎它的價值是什麼,我永遠不會使用它。看到_
永遠不會被束縛,它不能在表達式中使用,編譯器將其標記爲錯誤。
像_Var
這樣的變量是完全正常的變量,您可以匹配並將其綁定到值,這意味着它們可以在表達式中使用。用_
前綴變量大約是意圖。編譯器通常會警告你一個綁定在模式中但從未使用的變量,通常是錯誤的標誌。但是,編譯器不會提供以_
爲前綴的變量,如_Var
。目的是爲了給這個變量命名,命名是好的,但是我知道我永遠不會使用它。
請記住,_
實際上是唯一的特殊變量,而_Var
是正常變量,如果使用,則表現如此。如果你感覺不正常,那麼你可以用_
加上所有變量的前綴,所有東西都可以工作。
讓我們報價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,因此這裏的條件失敗。
好的,但有沒有什麼理由不使用這種變量,他們的名字以下劃線開頭? – coffeMug
@AKh_Sw因爲大多數人都希望編譯器警告未使用的變量,所以它存在。 –
@AKh_Sw正如響應結束時解釋的(例子2),它可能會產生不匹配。想象一下你有一個複雜的代碼,在重構之後,你決定取消使用一個以前使用的變量,但是這個變量在這個複雜的代碼中發生了好幾次。你只是把_不使用它,但它實際上被使用。那麼你可能會有意想不到的不匹配。 此外,需要使用這些下劃線變量來記錄代碼有時被認爲是一種「代碼味道」和簡化它的邀請。 –
- 1. 匿名類變量
- 2. 匿名變量(?)的優點?
- 3. 匿名類中的最終變量
- 4. C#中的匿名變量用法?
- 5. 匿名函數中的php變量
- 6. 匿名變量 - 序言
- 7. 在匿名類型中使用變量
- 8. 在匿名變量中迭代數據
- 9. erlang中的全局變量
- 10. 匿名函數的變量範圍
- 11. 一階邏輯Prolog的匿名變量
- 12. big.NewInt匿名變量的怪異行爲
- 13. 訪問匿名命名空間中的變量(C++)
- 14. 更新匿名函數中的命名函數變量Elixir
- 15. 比較序言匿名變量
- 16. 匿名變量只讀情況
- 17. 訪問陰影變量從匿名類
- 18. javascript匿名函數變量分配
- 19. 序言 - 列表和匿名變量
- 20. 從PHP匿名函數訪問變量
- 21. 匿名函數變量範圍[js,ajax]
- 22. 從匿名類變量返回數據
- 23. JavaScript中的匿名函數中的參數變量
- 24. java中的匿名塊中的靜態變量
- 25. 如何在jQuery中的匿名函數中獲取變量?
- 26. 在JavaScript中的匿名函數中觀察變量
- 27. C#中的匿名函數內變量的範圍
- 28. 在erlang模塊中使用匿名函數時遇到問題
- 29. Erlang幫助:在匿名函數中使用If語句
- 30. C++,匿名(未命名)變量的對象生命期
謝謝!這是一個答案。:-) – coffeMug