如何在不引发警告的情况下提供函数的默认实现?

时间:2016-06-03 20:24:01

标签: elixir

我想提供一个LibraryModule来像这样使用:

defmodule ClientModule do
  use LibraryModule
end

ClientModule.do_something # should work

我希望LibraryModule提供do_something/0的默认实现,只需在ClientModule中定义即可在GenServer中覆盖。但是,当我立即执行此操作时,我收到编译器警告:“此子句无法匹配,因为第X行的前一个子句始终匹配”。

似乎defoverridable这样做,但我不知道如何。

2 个答案:

答案 0 :(得分:4)

特别针对您的情况,例如:

LibraryModule

MyComparable

ClientModule

as is

IEX>

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

NewClientModule

__using__

IEX

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}}