2009-12-07 52 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

相关问题