でマクロでの動作とのプロトコルを実装します。私は比較的複雑な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
今私は経由のFooを実装することができますが、@parent_module
が決定され、使用されている方法が間違っているようです。上記のTODO
でハッキングを使用するよりも良い方法はありますか?これを行う慣用方法は何ですか?私はむしろFoo
を振る舞いにしないでしょう。これは、プロトコルの発送と統合が使用パターンに合っているからです。
私は実際には問題があなたの解決しようとして表示されていません。複雑でシンプルなユースケースを提供できますか?混乱させているのは、 'for:'オプションなしでdefimplを使うことです。 –
'for'パラメータはデフォルトで' defimpl'が定義されているモジュール –
'__MODULE__'だけでは機能しません。 –