澄清Phoenix迁移文件中使用的Elixir语法(特别是“创建”功能)

时间:2018-09-16 14:50:27

标签: elixir phoenix-framework phoenix

我对这种语法非常困惑:

create table(:topics) do
  add :title, :string
end

create是一个带有参数table()的函数,这是另一个函数,如果我错了,可以纠正我吗?但是接着是功能主体吗?

有人可以解释一下它是如何工作的吗?

2 个答案:

答案 0 :(得分:1)

create/2是一个带有两个值的宏。只是因为您像

这样称呼它
create table(...) do 
  ...
end

不必说。 table/2只是一个功能。您可以将上面的语句写为

table = table(:my_table)
create my_table do
  ...
end

您不是将函数传递给create宏,而是将恰好来自函数的值传递给create宏。

答案 1 :(得分:0)

do ... end不一定是函数体。它是通用语法,与宏一起使用时,会将其内容的AST(抽象语法树)传递给宏。这是一个演示:

defmodule A do
  defmacro a(args) do
    IO.inspect args
  end

  def main do
    a do
      1 + 2
    end
  end
end

A.main

输出:

[do: {:+, [line: 8], [1, 2]}]

因此,它只是块主体的AST,使用关键字do作为关键字列表传递。

create只是一个接受两个参数的宏:第一个是table,第二个是do ... end块。然后宏将转换该块并执行它。您可以查看该功能的the source code,以了解更多详细信息。