【发布时间】:2020-03-11 20:46:18
【问题描述】:
我正在学习 Elixir,遇到了这样的情况:
我有一个 Ecto 模式,我想创建一个像“get_by”这样的函数,它接受一个列名,它的值作为这样的参数:get_by(:id, 7)
所以函数的工作版本是这样的:
def get_by(column, value) do
Repo.all(
from(
r in __MODULE__,
where: field(r, ^column) == ^value,
)
)
end
我知道这是功能齐全的,但我想知道 field 宏是如何工作的。
原始代码对我来说太难阅读了。我试图在宏中使用 AST,但似乎没有任何效果。我拥有的最好的是:
defmacro magic(var, {:^, _, [{column, _, _}]}) do
dot = {:., [], [var, column]}
{dot, [], []}
end
但这会返回 r.column 而不是绑定到 column 变量的原子。
应该如何编写宏以返回r.id?
【问题讨论】:
-
如果您查看
Ecto.Query.API.field/2的源代码,它只是一个占位符:github.com/elixir-ecto/ecto/blob/v3.2.5/lib/ecto/query/… 查询宏查找对其的调用并按需要处理它们。
标签: macros elixir abstract-syntax-tree ecto