2017-02-28 68 views
3

說我有一個函數,如f(x,y)y參數是可選的。作爲可選參數設置y的首選方法是什麼?一個選項適用於我:朱莉婭約定的可選參數

function f(x, y=nothing) 
    # do stuff 
    if y == nothing 
     # do stuff 
    else 
     # do stuff 
    end 
    # do stuff 
end 

但這是首選的方式嗎?我無法將y設置爲計算中使用的單個默認值,因爲在y什麼都不是的情況下,會有不同的計算結果。我也可以有單獨的功能f(x)f(x,y)但這似乎是太多的代碼重複。

回答

5

這很好。請注意,可選參數會導致分派。這意味着if y == nothing(或等效地,if typeof(y) <: Void)將實際編譯。你會得到兩個不同的函數,這取決於用戶是否給出一個值。所以最後,if聲明編譯完成,這樣做效率非常高。

我會注意到,關鍵字參數現在也不是這樣。

另一種方式來做到這一點是有兩種方法:

f(x) 

f(x,y) 

無論兩種方法更好比1點的方法與if取決於問題。由於if將使用類型信息進行編譯,除了代碼組織之外,這兩種方法之間沒有區別。

+0

謝謝!您的版本是否檢查y是否沒有更好的/首選的方式? – ChrKroer

+0

我相信'y == Nothing'是檢查值會被編譯掉的一種情況,因爲'nothing'的唯一方法是使用'typeof(y)<:Void'。但是如果你總是使用類型檢查,你可以知道在類型穩定的函數中它們會被編譯掉。這個事實很安全。這是因爲類型穩定的函數肯定會知道類型,但不一定是值。 '虛空'是不同的,雖然 –

+0

我敢肯定這種方式是好的,但問題是什麼是首選的方式,首選的方式通常(但不是總是)定義兩個單獨的方法'f(x)'和' f(x,y)'。特別是如果它使代碼更清潔。 – DNF