2016-07-06 64 views
1

我是Elixir的新手,在閱讀了關於下劃線變量/函數here後,我對他們的實際使用案例有些困惑。爲什麼要定義一個永遠不會被使用的變量或函數呢?爲什麼要聲明永遠不會使用的變量或函數? (_foo)

我很熟悉_在模式匹配中的使用,當你想忽略匹配的某些部分,並且大概他們是密切相關的,但是我正在爲這種情況而苦苦掙扎。

+0

你有其中的功能被忽略的一個例子嗎?我想不起我的頭頂。 –

+0

對不起,對於功能,我的意思是「不輸入」而不是「忽略」。您的答案是變量正是我所需要的,謝謝! – FelixFortis

回答

4

我不知道的用例無視功能,但一個忽視的變量是給變量名所以如果你想在未來取消它的管理,你就知道哪一個要取消管理。比較這兩個例子:

def process_result({:ok, _, _, duration, count} do 
    # do something with duration & count 
end 

和:

def process_result({:ok, _timestamp, _user, duration, count} do 
    # do something with duration & count 
end 

想象回來,幾個月後閱讀此代碼。在第一個示例中,不查看代碼並找到調用該函數的位置,但不清楚兩個忽略的值是什麼。它是時間戳,然後是用戶,還是用戶然後時間戳?

在第二個例子中,它的明確表示這兩個值是時間戳,,然後是用戶。如果你關心這些值以後,它的非常容易只刪除下劃線並訪問變量按正常的功能:

def process_result({:ok, _timestamp, user, duration count} do 
    # do something with user, duration and count 
end 

值得一還,如果您使用的是提下劃線 - 前綴變量,Elixir會給你一個警告。這裏有一個小例子功能,這將給一個警告:

fn(_x) -> _x end 

和這裏的警告(我在一些換行補充):

warning: the underscored variable "_x" is used after being set. 
A leading underscore indicates that the value of the variable 
should be ignored. If this is intended please rename the 
variable to remove the underscore 
    iex:1 
1

以這種方式聲明的函數將從導入中排除,但可以在內部使用。

由於arity是固定的,函數參數(也是變量)必須被設置,下劃線使得它們的使用更透明:我知道我的回調得到3個參數,但我只需要第二個參數。

我不知道是否有這樣的正常變量聲明。

2

主要的原因是在多條功能使用模式匹配:

def process(:drivers_license, number) do 
    # process here ... 
end 

def process(:passport, number) do 
    # process here ... 
end 

def process(:unkown, _), do: nil 
相關問題