Je joue avec use
fonctionnalité dans l'élixir. Je ne peux pas comprendre une chose:
defmodule Alex do
use Included,
names: [:helen, :rebekka],
states: [
%{
:name => :start
}, [
name: :finish
]
end
J'ai placé différents constructeurs (map & mot-clé) juste pour montrer la différence. J'ai un module d'élixir simple qui me renvoie une valeur:
defmodule Included do
demacro __using__(opts) do
IO.puts Keyword.get(opts, :names) # => [:helen, :rebekka]
IO.puts Keyword.get(:states) # => [{:%{}, [line: 8], [name: :start]}, [name: :finish]]
end
end
Pourquoi est-ce que je reçois cette carte étrange et comment puis-je obtenir des cartes normales dans mon module?
Réponses:
1 pour la réponse № 1Ce que vous obtenez est la représentation AST de la opts
, comme tous les arguments passés aux macros. Si vous utilisez des proplists, celles-ci se présentent sous la même forme, entre guillemets:
iex> [name: :finish]
[name: :finish]
iex> quote do: [name: :finish]
[name: :finish]
Cependant, les cartes ne le sont pas, car elles ne font pas partie des types de données de base:
iex> %{name: :finish}
%{name: :finish}
iex> quote do: %{name: :finish}
{:%{}, [], [name: :finish]}
C'est la raison pour laquelle les proplists sont le moyen privilégié de passer des options à une macro. Cependant, vous pouvez utiliser une carte non citée dans un quote
comme prévu:
defmodule Included do
defmacro __using__(opts) do
quote do
IO.inspect unquote(opts)
end
end
end
defmodule Alex do
use Included, %{name: :start}
end
Cela va simplement imprimer
%{name: :start}