2009-12-07 53 views
8

是否可以使用變長參數列表定義函數?Erlang函數參數列表的可變長度

我知道我可以只寫:

function() -> function([]). 
function(X) when not is_list(X) -> function([X]); 
function(X) -> do_something_with_arguments(X). 

但我想避免這種技術。

回答

8

一種方式來做到這一點是通過所有參數的清單:

function(ListOfParameters)

,然後你可以遍歷說ListOfParameters。這樣,你可以讓你的函數聲明能夠接受任意數量的「參數」,只需要在聲明中添加更多的術語......但我不確定那是你所希望的。您是否正在考慮C vararg參數列表的行?在積極的情況下,請閱讀下一段。

你必須記住,Erlang基於模式匹配。函數「聲明」中的參數用作調用函數時的匹配模式。你必須放下你的「程序編程」心態,以充分利用Erlang的力量。

+0

你的答案的第一部分與我提到的技術相同,我想過類似於C的東西,所以我閱讀第二部分,現在我必須回到我的第一個解決方案。感謝您的迴應! – 2009-12-07 00:52:29

+0

我的榮幸!與Erlang玩得開心! – jldupont 2009-12-07 00:57:35

+0

如果你想要一個變量列表的參數,那麼你最好這樣做,然後你將不得不執行另一個函數,而將變量列表的參數傳遞給這個函數? – CMCDragonkai 2014-09-12 08:42:49

8

要比@jldupont更明確:不!

這並不是說它沒有被實現,但是在Erlang中,具有相同名稱但參數個數不同的函數被認爲是不同的函數,所以它不能被添加。

+0

是否有辦法分解參數列表並將每個參數應用於函數? – CMCDragonkai 2014-09-12 08:37:21

+0

@CMCDragonkai你的意思是將相同的功能應用於每個元素?用於這種用途:'list:map'或列表解析來獲取結果列表;或'lists:foldl'將返回值摺疊到對列表中下一個元素的調用中。 – rvirding 2014-09-12 09:46:08

+0

實際上,如果給出一個參數列表,我想調用另一個函數並將該列表作爲參數集傳遞。在Elixir中,有'apply'。 – CMCDragonkai 2014-09-12 11:25:58

相關問題