Function 长生不老药的作用是否有最大通气量?

Function 长生不老药的作用是否有最大通气量?,function,elixir,variadic-functions,Function,Elixir,Variadic Functions,函数可以接受的参数数量是否有上限?这不包括模式匹配。例如,定义为fn([arg1,arg2,arg3],arg4)的函数仅计为2 如果没有上限,Elixir是否也支持可变函数?Elixir运行在Erlang之上,对于Erlang,似乎有一个最大算术数255 见本页: 并向下搜索到包含该行的表: arity()0..255 确认更新: 尝试编译包含255个参数的函数可以正常工作 尝试编译带有256个参数的函数时,会出现以下编译错误: == Compilation error in file ari

函数可以接受的参数数量是否有上限?这不包括模式匹配。例如,定义为
fn([arg1,arg2,arg3],arg4)
的函数仅计为2


如果没有上限,Elixir是否也支持可变函数?

Elixir运行在Erlang之上,对于Erlang,似乎有一个最大算术数255 见本页: 并向下搜索到包含该行的表:
arity()0..255

确认更新: 尝试编译包含255个参数的函数可以正常工作

尝试编译带有256个参数的函数时,会出现以下编译错误:

== Compilation error in file arity.ex ==
** (CompileError) arity.ex:3: too many arguments (256) - maximum allowed is 255
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
** (CompileError)  compile error
    (iex) lib/iex/helpers.ex:183: IEx.Helpers.c/2
使用
c“arity.ex”
在Windows10 x64上的Elixir Shell中完成的测试,其中
arity.ex
的内容(加或减一个参数)为:

如果没有上限,Elixir是否也支持可变函数

梁不支持可变功能。这实际上是从Prolog继承的

Elixir通过创建调用第一个函数的第二个函数来伪造它,所以以这个例子为例。如果查看编译后的代码,您会发现有两个函数
count/1
count/2

def count(start , end \\ 10), do: ... 
如果要对其进行反编译,您会发现类似这样的代码

def count(start), do: count(start, 10)
def count(start, end), do: ...

我不知道这是否涵盖了可变函数的定义,但您可以提供默认值
def foo(bar,baz\\[])…
定义函数
foo
,可以用一个或两个参数调用它。如果使用1调用,则
baz
的值将为空列表。我不确定函数可以接受的参数数量是否有限制。请注意,您可以通过将其中一个参数作为列表传递来模拟变量函数——这正是您在问题中提到的方式。也就是说,传递一个列表,然后使用列表中的每个元素作为参数,这样就可以拥有不同数量的参数?为什么这一限制也适用于Elixir?Elixir与Erlang一样,被转换为Erlang AST(抽象语法树),然后被编译为Erlang虚拟机(BEAM)的字节码。我的猜测是,最后阶段的Erlang算法遵循Erlang算法,因此Elixir也必须这样做。让我们期待一位Erlang专家介入确认/否认这一点。我发现了一些似乎与您所说的相符的东西……我将推迟接受时间,看看我们是否能得到一些更令人满意的东西。就目前情况而言,非常感谢!
def count(start), do: count(start, 10)
def count(start, end), do: ...