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
将执行您想要的操作