Elixir将模块的引用作为函数参数传递

时间:2018-05-16 18:09:27

标签: elixir phoenix-framework

我是elixir / phoenix的新手。我有这样的功能

defp get_list(old_result, filter) do
  MY.Model.search_name(filter)
  |> Enum.concat(old_result)
end

现在,为了使其更易于重复使用,我想将Model的引用传递给函数,因此它类似于:

defp get_list(old_result, filter, AnotherModel) do
  MY.AnotherModel.search_name(filter)
  |> Enum.concat(old_result)
end

但当然上述功能不起作用。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

您可以将完整的模块名称作为普通参数传递,如下所示:

defmodule A do
  def get_list(old_result, filter, some_module) do
    filter
    |> some_module.search_name
    |> Enum.concat(old_result)
  end
end

A.get_list(old_result, filter, MY.AnotherModule)

答案 1 :(得分:2)

虽然凯文约翰逊的答案是完全有效的,但有一个确切的解决方案,只传递模型,没有名称空间。可以使用Module.concat/2后跟Kernel.apply/3

来实现
defmodule A do
  @namespace MY
  def get_list(old_result, filter, model) do
    @namespace
    |> Module.concat(model)
    |> Kernel.apply(:search_name, [filter])
    |> Enum.concat(old_result)
  end
end
A.get_list(old_result, filter, AnotherModule) # note not FQ-name