我可以为任何现有的arity导入函数吗?

时间:2016-03-27 16:22:03

标签: elixir

假设我有一个具有不同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

2 个答案:

答案 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/2plus/3plus/4可能共享一个名称,但它们的功能不同。见http://elixir-lang.org/crash-course.html#identifying-functions

这也是在only上指定import选项时需要明确列出的原因。您正在从模块中导入这3个不同的功能。