【发布时间】:2019-03-19 16:03:49
【问题描述】:
如果我们检查 official docs 中使用 Ecto 片段的示例,它表示要使用来自另一个模块的宏,我们需要先导入该模块。所以,如果我们有一个带有coalesce/2 宏的模块:
defmodule CustomFunctions do
defmacro coalesce(left, right) do
quote do
fragment("coalesce(?, ?)", unquote(left), unquote(right))
end
end
end
我们需要在另一个模块中导入它才能使用它:
import CustomFunctions
然后,我们可以像这样编写查询:
where(Post, [p], p.id in coalesce(3,5)
只要没有名称冲突,它就可以很好地工作。但是,假设出于某种原因,我正在创建一些模块,它们将只导出一个名为 query 的宏,显然这不会花费很长时间,直到名称冲突开始出现。所以我想知道是否可以使用上面的宏使用它的全名,像这样:
require CustomFunctions
where(Post, [p], p.id in CustomFunctions.coalesce(3,5)
显然我尝试过但失败了,说CustomFunctions.coalesce(3,5) 不是一个合适的查询元素。
那么,有没有一种简单的方法来实现这样的目标?
【问题讨论】: