Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir Phoenix,模型模式中的函数_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

Elixir Phoenix,模型模式中的函数

Elixir Phoenix,模型模式中的函数,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,如何在模式中添加函数?我想创建一个函数,用于向模型模式动态添加字段。例如: def func do # .. loop to create dynamic fields field :street, :string end schema "objects" do func end ... Error: ** (CompileError) web/models/objects.ex:12: undefined function func/0 func

如何在模式中添加函数?我想创建一个函数,用于向模型模式动态添加字段。例如:

  def func do
    # .. loop to create dynamic fields
    field :street, :string
  end

  schema "objects" do
    func
  end

... Error:

** (CompileError) web/models/objects.ex:12: undefined function func/0

func
需要位于一个单独的模块中,因为您希望从该模块的主体调用它
func
还需要是一个宏,返回一个包含
字段
调用的带引号的AST,以便
字段
能够将字段放入正确的模块中,因为
字段
也是一个宏。您正在寻找这样的东西:

defmodule MyApp.Post.Helper do
  defmacro func do
    quote do
      field :foo, :string
    end
  end
end

defmodule MyApp.Post do
  use MyApp.Web, :model
  import MyApp.Post.Helper

  schema "posts" do
    func()
  end
end
测试:

iex(1)>%Post{}
%MyApp.Post{{uuuuu meta}:{eto.Schema.Metadata,foo:nil,id:nil}

func
需要位于一个单独的模块中,因为您希望从该模块的主体调用它
func
还需要是一个宏,返回一个包含
字段
调用的带引号的AST,以便
字段
能够将字段放入正确的模块中,因为
字段
也是一个宏。您正在寻找这样的东西:

defmodule MyApp.Post.Helper do
  defmacro func do
    quote do
      field :foo, :string
    end
  end
end

defmodule MyApp.Post do
  use MyApp.Web, :model
  import MyApp.Post.Helper

  schema "posts" do
    func()
  end
end
测试:

iex(1)>%Post{}
%MyApp.Post{{uuuuu meta}:{eto.Schema.Metadata,foo:nil,id:nil}

我可以将参数传递给defmacro func..吗?可以,但它与函数参数不完全相同。您必须使用quote/unquote。请参见.Sidenote:
defmacro
不是函数,它是。我可以将参数传递给defmacro func吗?是的,但它与函数参数不完全相同。您必须使用quote/unquote。请参见.Sidenote:
defmacro
不是一个函数,而是一个函数。