【问题标题】:Elixir: How to alias a module that just imports a load of functionsElixir:如何为仅导入大量函数的模块起别名
【发布时间】:2017-11-20 16:21:03
【问题描述】:

我想将我的 Accounts 上下文函数放入它们自己的文件中,然后将它们导入到上下文中,这样我就可以在我的控制器中为 App.Accounts 设置别名并使用导入到上下文中的函数。

请参阅下面的粗略设置。

defmodule App.Accounts.UserAPI do
  alias App.Accounts.User

  def get_user!(id), do: User.get!(User, id) end

  defmacro __using__(_) do
    import App.Accounts.UserAPI
end

defmodule App.Accounts do
  alias App.Accounts.UserAPI
  use UserAPI
end

defmodule AppWeb.UserController do
  alias App.Accounts

  IO.inspect Accounts.module_info
  # [
    # module: Ev2.Accounts, 
    # exports: [__info__: 1, module_info: 0, module_info: 1],
    # attributes: [vsn: [234644860605005629180170678994286615550]],
    # compile: [options: [:debug_info], version: '7.0.4',
    # source: '/Users/.../accounts.ex'],
    # native: false,
    # md5: <<176, 134, 244, 210, 70, 244, 89, 41, 130, 7, 134, 109, 55, 131, 27, 254>>
  # ]
  def index(conn, %{"id" => id}) do
    Accounts.get_user(id) # Accounts.get_user/1 is not defined
  end
end

我目前通过将整个 App.UserAPI 包装在 __using__ 宏和引号中来使其工作,但这感觉很冗长,并且在引号中包装似乎阻止我从 UserAPI 中调用实用程序函数。

为什么UserAPI 函数不出现在Accounts.module_info 导出中? 什么是“正确”的做法?

谢谢!

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    问题是导入的函数不是由模块导出的。它们仅在导入的上下文中可用。您想重新导出导入的函数。我能想到的方法有两种。

    1. 根据你的描述你目前在做什么:在__using__的引用块中定义所有函数:

      defmodule App.Accounts.UserAPI do
        defmacro __using__(_) do
          quote do
            alias App.Accounts.User
      
            def get_user!(id), do: User.get!(User, id) end
          end
        end
      end
      
    2. 使用defdelegate 定义一个只调用另一个函数的函数:

      defmodule App.Accounts.UserAPI do
        def get_user!(id), do: User.get!(User, id) end
      
        defmacro __using__(_) do
          quote do
            defdelegate :get_user!(id), to: App.Accounts.UserAPI
          end
        end
      end
      

    在这两种情况下,use App.Accounts.UserAPI 都能满足您的需求。

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      相关资源
      最近更新 更多