【问题标题】:Elixir's use with function nameElixir 与函数名的使用
【发布时间】:2020-08-11 17:08:25
【问题描述】:

最近我偶然发现了这段代码

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

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    __using__/1 只是一个宏use Mod, args 只是Mod.__using__(args) 的语法糖。

    它不调用 __using__/1 宏,而是调用一个函数 [...]

    完全错误,它调用MyAppWeb.__using__/1 宏。

    如果你打开你的(也生成的)MyAppWeb,你会发现那里有点像

      defmacro __using__(which) when is_atom(which) do
        apply(__MODULE__, which, [])
      end
    

    也就是说,您可以直接调用which,或者修改MyAppWeb.__using__/1 以接受参数。

    【讨论】:

    • 其实MyAppWeb是这样的:defmodule MyAppWeb do ... def live_view do quote do ... end end ... end
    • 哦该死的...我没有滚动到最后
    • 如果__using__/1 没有在Mod 中定义,use Mod 将无法编译:)
    • 另外,请考虑仔细阅读elixir-lang.org/getting-started/alias-require-and-import.html。 use 宏在概念上分为 require、import 和 alias,这个页面对每一个都有很好的解释。
    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2018-08-16
    • 2018-03-07
    • 1970-01-01
    • 2014-03-25
    相关资源
    最近更新 更多