2016-05-10 5 views
1

私はuseのエリキシル剤で遊んでいます。私は別のコンストラクタ(マップ&キーワードを)置いエリクサーの引数としてマップを正しく配置できないのはなぜですか?

defmodule Alex do 
    use Included, 
    names: [:helen, :rebekka], 
    states: [ 
     %{ 
     :name => :start 
     }, [ 
     name: :finish 
     ] 
end 

だけの違いを示すために:私は一つのことを理解することはできません。私は私に値を返す単純なエリクシルのモジュールがあります。

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 

私はこの奇妙なマップを受け取りなぜ、どのように私は私のモジュールで法線マップを得ることができますか?

+0

二つの提案を出力します

defmodule Included do defmacro __using__(opts) do quote do IO.inspect unquote(opts) end end end defmodule Alex do use Included, %{name: :start} end 

この:しかし、あなたは予想通りquote内の引用符で囲まれていないマップを使用することができますが、マクロで遊ぶ前に、1)エリクシール詳細については、こちらをご覧ください。マクロを使用せずにやりたいことをいくつか行う方法があり、マクロ以外にも何かを使うことは、コードを維持できるという観点からはるかに優れたアプローチです。 2.マクロを習得したい場合は、件名に関する素晴らしい本があります:https://pragprog.com/book/cmelixir/metaprogramming-elixir –

+0

@OnorioCatenacci私はDave Thomasのプログラミングエリクサー全体を読んでいます; hehe;)ありがとう提案のために – asiniy

答えて

1

マクロに渡される引数と同じように、optsのAST表現が得られます。あなたはproplistをを使用している場合、これらは引用された引用符で囲まれていない形で同じ形を取ることが起こる:彼らは基本的なデータ型の中ではありませんので、

iex> [name: :finish] 
[name: :finish] 

iex> quote do: [name: :finish] 
[name: :finish] 

地図は、しかし、しないでください。

iex> %{name: :finish} 
%{name: :finish} 

iex> quote do: %{name: :finish} 
{:%{}, [], [name: :finish]} 

これをプロプリストがマクロにオプションを渡すための好ましい方法である理由です。単に

%{name: :start} 
+0

奇妙に見えますが、それは私のためには機能しません – asiniy

関連する問題