我有一個具有單一功能具有相對複雜的API協議:實現與行爲的協議中的一個宏在藥劑
defprotocol Foo do
def complex(foo, x, y)
end
我想提供一種方法來實現此協議爲共同和更簡單的用例。一些實驗後,我想出了以下內容:
defmodule Bar do
@callback simple(any, any) :: boolean
defmacro __using__(_) do
quote do
@behaviour Bar
defimpl Foo do
# TODO this is really hacky. What is a better way to reference parent module?
# Note that the 1 in drop(1) is from Foo's module name
@parent_module __MODULE__ |> Module.split |> Enum.drop(1) |> Module.concat
def complex(bar, x, _y) do
matches = @parent_module.simple(bar, x)
if matches, do: [x], else: []
end
end
end
end
end
現在我可以通過實現富,但@parent_module
確定和使用的方式似乎是錯誤的。有沒有更好的辦法比上面的TODO
使用黑客?做這件事的慣用方法是什麼?我寧願將Foo
變爲行爲,因爲協議的分派和合並符合使用模式。
我實在不明白你試圖解決的問題。你能提供一個複雜而簡單的用例嗎?令我困惑的是沒有'for:'選項的defimpl的使用。 –
'for'參數默認爲定義'defimpl'的模塊 –
爲什麼不只是'__MODULE__'工作? –