假设我有一个具有不同arity头的函数的模块。有没有办法在另一个模块中为所有可用的arities导入此函数(不明确)?
defmodule Math do
def plus(a, b) do
end
def plus(a, b, c) do
end
def plus(a, b, c, d) do
end
end
defmodule AdditiveCalculator do
# Explicit import
import Math, only: [plus: 2, plus: 3, plus: 4]
# What i'm hoping for
import Math, only: [plus: :all]
end
答案 0 :(得分:2)
据我所知,Elixir中没有这样的功能。
有关详细信息,请参阅here。
编辑:
@tkowal在上面的评论中提出了一个很好的观点。如果你试图对整数的变量列表求和,那么正确的方法是将参数作为整数列表传递,然后使用它。像这样:
defmodule T do
def plus(l) when is_list(l), do: plus(l,0)
defp plus([], acc), do: acc
defp plus([item] = l, acc), do: acc + item
defp plus([head|tail] = l, acc), do: plus(tail, acc+head)
end
然后使用它,像这样调用它:
T.plus([1,2,3,4])
#=> 10
答案 1 :(得分:2)
您的问题对Elixir中函数的性质做出了错误的假设。你说你已经拥有了一个具有不同智慧的头脑的功能。后来"这个功能"。
你不具备多头的单一功能。你实际上有3个不同的功能。函数由name和arity标识。 plus/2
,plus/3
和plus/4
可能共享一个名称,但它们的功能不同。见http://elixir-lang.org/crash-course.html#identifying-functions
这也是在only
上指定import
选项时需要明确列出的原因。您正在从模块中导入这3个不同的功能。