【问题标题】:Variable length of function argument list in ErlangErlang中函数参数列表的可变长度
【发布时间】:2009-12-07 21:37:05
【问题描述】:

是否可以定义具有可变长度参数列表的函数?

我知道我只会写:

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

但我想避免这种技术。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    一种方法是传递列表中的所有参数:

    function(ListOfParameters)

    然后您可以遍历上述ListOfParameters。这样,您可以让您的函数声明能够接受任意数量的“参数”,只需在声明中添加更多术语......但我不确定这是否是您所希望的。您是否按照 C vararg 参数列表的思路思考?在肯定的情况下,请阅读下一段。

    您必须记住,Erlang 是基于模式匹配的。调用函数时,函数“声明”中的参数用作匹配模式。您必须抛开“过程式编程”思维方式,才能充分利用 Erlang 的力量。

    【讨论】:

    • 您的答案的第一部分与我提到的技术相同,我想到了类似于 C 的东西,所以我阅读了第二部分,所以现在我必须回到我的第一个解决方案。感谢您的回复!
    • 我的荣幸!和 Erlang 一起玩吧!
    • 如果您想要一个变量的参数列表,然后您必须在将变量的参数列表传递给另一个函数时执行另一个函数,那么最好的做法是什么?
    【解决方案2】:

    比@jldupont 更明确:不!

    并不是刚刚没有实现,而是在Erlang中,同名但参数个数不同的函数被认为是不同的函数,所以不能添加。

    【讨论】:

    • 有没有办法分解参数列表并将每个参数应用于函数?
    • @CMCDragonkai 你的意思是对每个元素应用相同的功能?对于该用途:lists:map 或列表推导以获取结果列表;或lists:foldl 将返回值折叠到对列表中下一个元素的调用中。
    • 实际上,如果给定一个参数列表,我想调用另一个函数并将列表作为参数集传递。在 Elixir 中,有 apply
    • 在erlang中当然有一个apply/3,供灵药apply完成工作。 Elixir 建立在 erlang、erlang 库和 OTP 之上。
    猜你喜欢
    • 2011-12-02
    • 2011-11-27
    • 2022-09-23
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多