Macros 调用EXTO架构块中的自定义宏

Macros 调用EXTO架构块中的自定义宏,macros,elixir,metaprogramming,ecto,Macros,Elixir,Metaprogramming,Ecto,EXTO框架的模式模块定义: defmodule Storage.Repo.Category do use Ecto.Schema schema "categories" do field :name field :path field :color field :desc field :sequ, :integer hello() timestamps() end defmacro hello do quot

EXTO框架的模式模块定义:

defmodule Storage.Repo.Category do
  use Ecto.Schema

  schema "categories" do
    field :name
    field :path
    field :color
    field :desc
    field :sequ, :integer

    hello()
    timestamps()
  end

  defmacro hello do
    quote do
      field :hello
    end
  end
end
编译失败

 (CompileError) lib/storage/repo/category.ex:15: undefined function hello/0

我该怎么办?原因是什么?

您需要在另一个模块中定义宏,
要求/导入它,然后调用它:

defmodule Storage.SchemaMacros do
  defmacro hello do
    quote do
      field :hello
    end
  end
end
现在叫它:

defmodule Storage.Repo.Category do
  use Ecto.Schema
  import Storage.SchemaMacros

  schema "categories" do
    field :name
    field :path
    field :color
    field :desc
    field :sequ, :integer

    hello()
    timestamps()
  end
end


您通常可以在同一模块中定义和调用宏(只要在调用宏之前定义了宏),但Ecto自己的
schema/2
宏在后台工作的方式不允许您这样做。

您需要在其他模块中定义宏,
需要/导入它,然后调用它:

defmodule Storage.SchemaMacros do
  defmacro hello do
    quote do
      field :hello
    end
  end
end
现在叫它:

defmodule Storage.Repo.Category do
  use Ecto.Schema
  import Storage.SchemaMacros

  schema "categories" do
    field :name
    field :path
    field :color
    field :desc
    field :sequ, :integer

    hello()
    timestamps()
  end
end

您通常可以在同一个模块中定义和调用宏(只要在调用宏之前定义了宏),但Ecto自己的
schema/2
宏在后台工作的方式不允许您这样做