在 Ecto 架构块中调用自定义宏



Ecto 框架的模式模块定义:

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

我该怎么办?这是什么原因造成的?

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

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宏在后台的工作方式不允许你这样做。

最新更新