2017-04-19 34 views
5

在Elixir中處理可變元數據的最佳做法是什麼,而不會導致不必要的複雜性&大小寫匹配?可變靈活性藥劑功能的最佳實踐?

Python的例子:

def function_with_optional_param(param1, param2, param3=None): 
    if not param3: 
     param3 = "Whatever" 

    return 

如何參數3最好的藥劑處理的?

回答

7

這是Elixir中非常常見的模式。最後一個參數應該是一個列表(關鍵字列表具體),默認爲[]。在Elixir中,如果最後一個參數是關鍵字列表,則不需要在列表中添加[]。例如:

def do_lots(arg1, arg2, opts \\ []) do 
    one = opts[:one] || :default 
    two = opts[:two] # default to nil if it's not passed 
    # do something with arg1, arg2, one, and two 
end 

def my_func do 
    arg1 
    |> do_lots(2) 
    |> do_lots(49, one: :question) 
    |> do_lots(99, two: :agent) 
    |> do_lots(-1, one: 3, two: 4) 
end 

處理變量大小參數的其他選項是將它們全部作爲列表傳遞。這使得函數arity 1可以根據需要進行處理。

最後,您可以將某些或全部參數作爲地圖傳遞。這有利於您在地圖上模式匹配,並根據地圖中傳遞的鍵創建多個函數子句。

請記住,您無法輕鬆地在匹配關鍵字列表上進行匹配,因爲它們與訂單相關。

2

最好的辦法是使用默認參數:

def function_with_optional_param(param1, param2, param3 \\ "Whatever") do 
    # something 
end 

但它實際上創建了兩個功能 - 一個有兩個參數,另一個有三個。