我是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
但当然上述功能不起作用。我怎么能这样做?
答案 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