У меня есть проект, в котором мне нужно определить несколько протоколов с разными именами, но иметь абсолютно одинаковые определения.
Я пытался сделать это с use/2
, но не повезло: он не ' t, определения из __using__/1
не появляются в результирующем протоколе:
defmodule Action do
defmacro __using__(_) do
quote do
def run(tool)
end
end
end
defprotocol Actions.ShowId do
use Action
end
defmodule Tools.SimpleRelay do
defstruct [:id]
defimpl Actions.ShowId do
def run(%Tools.SimpleRelay{id: id}), do: IO.puts(inspect(id))
end
end
На структуре с определением реализации протокола я получаю:
warning: module Actions.ShowId is not a behaviour (in module Actions.ShowId.Tools.SimpleRelay)
iex:8: Actions.ShowId.Tools.SimpleRelay (module)
И если я пытаюсь используйте это:
iex(6)> relay = struct(Tools.SimpleRelay, id: "ALongStringId")
%Tools.SimpleRelay{id: "ALongStringId"}
iex(7)> Actions.ShowId.run(relay)
** (UndefinedFunctionError) function Actions.ShowId.run/1 is undefined or private
Actions.ShowId.run(%Tools.SimpleRelay{id: "ALongStringId"})
Это ошибка или цель? Или просто мое неправильное определение?
Я пытался задать тот же вопрос на elixirforum (и разместил там этот фон с заданиями), и единственное предложение, которое я получил до сих пор, это то, что это ошибка. Я хотел бы уточнить, что это действительно ошибка перед открытием проблемы.
Спасибо!