/ / Pourquoi ne puis-je pas mettre correctement la carte en argument dans l'élixir? - élixir

Pourquoi ne puis-je pas mettre correctement la carte comme argument dans l'élixir? - élixir

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 № 1

Ce 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}