我需要我的所有模型来实现特定的协议。我目前的尝试是MyApp.Convert定义了这个宏的模块:
defmodule ConvertMacro do
@moduledoc """
All model structs need to implement the convert interface and must be added
here.
"""
defmacro defimpl_convert_for(modules) do
Enum.map(modules, fn module ->
quote do
defimpl Units.Convert, for: unquote(module) do
require Units
def to_standard_metric(struct) do
Units.to_standard_metric_for_struct(unquote(module), struct)
end
def to_user_data(struct) do
Units.to_user_data_for_struct(unquote(module), struct)
end
end
end
end)
end
end
ConvertMacto.defimpl_convert_for([MyApp.User, MyApp.Block])
Run Code Online (Sandbox Code Playgroud)
错误:
== Compilation error on file lib/protocols/units_convert.ex ==
** (UndefinedFunctionError) function ConvertMacro.defimpl_convert_for/1 is undefined or private. Did you mean one of:
* defimpl_convert_for/1
ConvertMacro.defimpl_convert_for([UdioDb.Block])
(elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1
Run Code Online (Sandbox Code Playgroud)
(错误信息其实有点多余)
有没有办法实现我想要做的事情,还是我只需要全部输入?
它实际上要简单得多,因为defimpl它本身就支持它:
defimpl FooProtocol, for: [Foo, Baz, Bar] do
def protocol_function(x, y, z) do
@for.some_function(x, y, z)
end
end
Run Code Online (Sandbox Code Playgroud)
该@for模块属性允许您访问该协议是为实现该模块。您可以在此处查看示例:https : //github.com/elixir-ecto/ecto/blob/master/lib/ecto/date_time.ex#L650-L662
| 归档时间: |
|
| 查看次数: |
386 次 |
| 最近记录: |