2016-05-06 6 views

答えて

3

一つの主な違いは、単に、__using__内のコードが呼び出され、戻り値が​​が呼ばれながら、できるだけ早くあなたがモジュール内use呼び出しとして注入し、直接モジュール内のすべてのコードの後に​​注入された戻り値が実行されていることですモジュールがコンパイルされる前に

違いを実証するための簡単なプログラム:

defmodule When do 
    defmacro __using__(_) do 
    IO.inspect :using 
    __CALLER__.module |> Module.definitions_in |> IO.inspect 
    quote do end 
    end 

    defmacro __before_compile__(_) do 
    IO.inspect :before_compile 
    __CALLER__.module |> Module.definitions_in |> IO.inspect 
    quote do end 
    end 
end 

defmodule Main do 
    @before_compile When 
    use When 
    IO.puts "added `@before_compile` and `use`" 
    def add(x, y), do: x + y 
end 

出力:すべてのテストが、それは可能ExUnitランナーが取得できるようにすること返す関数を定義するための

:using 
[] 
added `@before_compile` and `use` 
:before_compile 
[add: 2] 

ExUnit uses @before_compileとすべてのテストを実行します。

関連する問題