代码之家  ›  专栏  ›  技术社区  ›  Kamrul Khan

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

  •  3
  • Kamrul Khan  · 技术社区  · 6 年前

    我对长生不老药/凤凰很陌生。我有一个这样的函数

    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 回复  |  直到 6 年前
        1
  •  5
  •   Kevin Johnson    6 年前

    您可以像传递普通参数一样传递完整的模块名,如下所示:

    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)
    
        2
  •  3
  •   Aleksei Matiushkin    6 年前

    虽然凯文·约翰逊的答案完全正确,但传球有一个精确的解决方案 仅适用于模型 ,没有命名空间。可以通过以下方式实现 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