j'ai un protocole qui a une seule fonction avec une API relativement complexe:Mettre en œuvre un protocole avec un comportement dans une macro dans Elixir
defprotocol Foo do
def complex(foo, x, y)
end
Je veux fournir un moyen de mettre en œuvre ce protocole pour une commune et cas d'utilisation plus simple. Après quelques essais, je suis venu avec ce qui suit:
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
Maintenant, je peux mettre en œuvre Foo via , mais la façon dont @parent_module
est déterminé et utilisé semble mal. Y at-il une meilleure façon que d'utiliser le hack dans le TODO
ci-dessus? Quelle est la manière idiomatique de le faire? Je préfère ne pas transformer Foo
en un comportement parce que la répartition et la consolidation des protocoles correspond au modèle d'utilisation.
Je ne vois pas vraiment le problème que vous essayez de résoudre . Pouvez-vous fournir un cas d'utilisation complexe et simple? Ce qui m'embrouille, c'est l'utilisation de defimpl sans l'option 'for:'. –
Le paramètre 'for' utilise par défaut le module dans lequel' defimpl' est défini –
Pourquoi '__MODULE__' ne fonctionne-t-il pas? –