【问题标题】:Call a custom Macro in an Ecto Schema block在 Ecto Schema 块中调用自定义宏
【发布时间】:2019-03-11 16:24:28
【问题描述】:

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

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

【问题讨论】:

    标签: macros elixir metaprogramming ecto


    【解决方案1】:

    您需要在另一个模块中定义您的宏,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 宏在后台工作的方式不允许您这样做。

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 1970-01-01
      • 2020-04-06
      • 2018-07-22
      • 1970-01-01
      • 2015-08-15
      • 2020-06-20
      • 2012-07-24
      相关资源
      最近更新 更多