Elixir:如何对只导入一堆函数的模块进行别名

Elixir:如何对只导入一堆函数的模块进行别名,elixir,phoenix-framework,Elixir,Phoenix Framework,我想将我的帐户上下文函数放入它们自己的文件中,然后将它们导入到上下文中,这样我就可以在控制器中为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.Acc

我想将我的帐户上下文函数放入它们自己的文件中,然后将它们导入到上下文中,这样我就可以在控制器中为
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
defmodule App.Accounts.UserAPI do
别名App.Accounts.User
def get_用户!(id),do:User.get!(用户,id)结束
定义宏\uuuuuu使用\uuuu(\uu)do
导入App.Accounts.UserAPI
结束
defmodule应用程序。帐户做什么
别名App.Accounts.UserAPI
使用用户API
结束
defmodule AppWeb.UserController do
别名App.Accounts
IO.inspect Accounts.module\u信息
# [
#模块:Ev2.账户,
#导出:[模块信息:1,模块信息:0,模块信息:1],
#属性:[vsn:[2346448600505629180170678994286615550]],
#编译:[选项:[:调试信息],版本:“7.0.4”,
#来源:'/Users/../accounts.ex'],
#本地人:错,
#md5:
# ]
def索引(conn,%{“id”=>id})do
Accounts.get_user(id)#Accounts.get_user/1未定义
结束
结束
目前,我使用宏和引号将整个
App.UserAPI
包装在
\uu中,但这感觉很冗长,而且在引号中包装似乎阻止我从
UserAPI
中调用实用程序函数

为什么
UserAPI
函数不出现在
帐户.模块信息
导出中? “正确”的方法是什么


谢谢

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

  • 根据您的描述,您当前正在执行的操作:在
    \u中使用
    定义引号块中的所有函数:

    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
    
  • 使用
    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
    

  • 在这两种情况下,
    使用App.Accounts.UserAPI
    将执行您想要的操作。

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

  • 根据您的描述,您当前正在执行的操作:在
    \u中使用
    定义引号块中的所有函数:

    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
    
  • 使用
    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
    
  • 在这两种情况下,
    使用App.Accounts.UserAPI
    将执行您想要的操作