Elixir 对函数名的使用
Elixir's use with function name
最近我偶然发现了这段代码
defmodule MyAppWeb.PageLive do
use MyAppWeb, :live_view
它是使用 Phoenix Live View (mix phx.new --live
) 生成的默认应用程序的一部分。
这是我第一次看到 use
构造函数名称作为第二个参数。
我试图在网上搜索一些关于它的文档,但找不到合适的命名。
你能帮我理解执行时会发生什么吗?
它不调用 __using__
宏而是调用一个函数,我不确定我是否可以在那里传递一些选项,或者我需要使用“正常”方式(使用 __using__
宏)。
我试过 use MyAppWeb, :live_view, opts
之类的方法,但会引发 undefined function use/3
__using__/1
只是一个宏,而 use Mod, args
只是 Mod.__using__(args)
.
的语法糖
It doesn't call __using__/1
macro but calls a function instead [...]
完全错误,它调用了MyAppWeb.__using__/1
宏。
如果你打开你的(也是生成的)MyAppWeb
,你会发现那里有点像
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__, which, [])
end
也就是说,您可以直接调用 which
,或修改 MyAppWeb.__using__/1
以接受参数。
最近我偶然发现了这段代码
defmodule MyAppWeb.PageLive do
use MyAppWeb, :live_view
它是使用 Phoenix Live View (mix phx.new --live
) 生成的默认应用程序的一部分。
这是我第一次看到 use
构造函数名称作为第二个参数。
我试图在网上搜索一些关于它的文档,但找不到合适的命名。
你能帮我理解执行时会发生什么吗?
它不调用 __using__
宏而是调用一个函数,我不确定我是否可以在那里传递一些选项,或者我需要使用“正常”方式(使用 __using__
宏)。
我试过 use MyAppWeb, :live_view, opts
之类的方法,但会引发 undefined function use/3
__using__/1
只是一个宏,而 use Mod, args
只是 Mod.__using__(args)
.
It doesn't call
__using__/1
macro but calls a function instead [...]
完全错误,它调用了MyAppWeb.__using__/1
宏。
如果你打开你的(也是生成的)MyAppWeb
,你会发现那里有点像
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__, which, [])
end
也就是说,您可以直接调用 which
,或修改 MyAppWeb.__using__/1
以接受参数。