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 以接受参数。