2016-05-15 55 views
1

在仙丹是可能的函數定義使用默認參數,但我發現它不可能用單一的關鍵字列表參數,像這樣做:藥劑,默認的關鍵字列表參數

def do_stuff(
    success: sucess \\ fn(conn) -> conn end, 
    error: error 
) do 
    # ... 
end 

另外,我想過避免這種通過使用諸如JS承諾之類的類似於「回調傳遞」的編碼風格,但我無法找到Elixir的promise的實現。

也許在語言中有內置的東西可以幫助我編寫更好的代碼並更接近長生不老的標準。

主要問題:是否可以使用默認關鍵字參數?

旁邊的問題: Elixir提供了什麼東西來幫助避免這種「回調傳遞」編程風格,以支持更具反應性/可組合的機制?

回答

5

不,這不可能使用默認的關鍵字參數作爲關鍵字參數只是在一個單一的關鍵字列表的語法糖:

do_stuff(success: ..., failure: ...) 

相同

do_stuff([success: ..., failure: ...]) 

所以關鍵字列表真的只是一個參數。你在函數定義中做的是匹配關鍵字列表傳遞給do_stuff/1:一定要注意這一點,因爲如果關鍵字的順序不相同,你的函數定義將不匹配(即,do_stuff(failure: ..., success: ...))。

我想克服這個一個很好的方法就是使用兩種不同的論據,do_stuff功能:

def do_stuff(success \\ fn(conn) -> conn end, failure \\ fn(err) -> err end) 

這樣默認參數正常工作。如果你真的需要你的論點是一個關鍵字列表,那麼你可以處理默認功能的體內:

def do_stuff(options) do 
    success = options[:success] || (fn(conn) -> conn end) 
    failure = options[:failure] || (fn(err) -> err end) 
end 

最後,關於「回調風格」你提到的,我不知道任何東西,除了通過fn來完成某些工作之外,它的工作方式與通過fn完全不同,除非您開始研究併發和消息傳遞。