我想提供一个LibraryModule
来像这样使用:
defmodule ClientModule do
use LibraryModule
end
ClientModule.do_something # should work
我希望LibraryModule
提供do_something/0
的默认实现,只需在ClientModule
中定义即可在GenServer
中覆盖。但是,当我立即执行此操作时,我收到编译器警告:“此子句无法匹配,因为第X行的前一个子句始终匹配”。
似乎defoverridable
这样做,但我不知道如何。
答案 0 :(得分:4)
特别针对您的情况,例如:
MyComparable
as is
defmodule LibraryModule do
defmacro __using__(_) do
quote([]) do
@behaviour LibraryModule
def do_something(), do: "Didn't do much but still"
defoverridable [do_something: 0]
end
end
@callback do_something() :: any
end
defmodule ClientModule do
use LibraryModule
end
会调用ClientModule.do_something()
# "Didn't do much but still"
宏,然后引用的代码部分会被注入use LibraryModule
,因此
__using__/1
获取ClientModule
回调函数的默认实现。
ClientModule
宏在编写库时非常do_something/0
。
__using__
useful
答案 1 :(得分:0)
defmacro __using__(_) do
quote do
def init(args) do
{:ok, args}
end
defoverridable [init: 1]
end
end
GenServer does it使用defoverridable。
高度简化的代码段:
{{1}}