Elixir与函数名称一起使用

问题描述

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

defmodule MyAppWeb.PageLive do
  use MyAppWeb,:live_view

它是使用Phoenix Live View(mix phx.new --live生成认应用程序的一部分。
这是我第一次看到带有函数名称作为第二个参数的use构造。
我试图在网上搜索有关此文档的一些文档,但是找不到合适的名称

您能帮助我了解执行此操作时会发生什么情况吗?

它不会调用__using__宏,而是调用一个函数,而且我不确定是否可以在其中传递一些选项,或者我是否需要使用“常规”方式(对于{{1} }宏)。 我已经尝试过类似__using__方法,但是会提高use MyAppWeb,:live_view,opts

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...