當我們把共同的邏輯抽出成套件時,有時後會需要規定使用的模組有定義特定的函式作為 callback,
除了之前介紹過得 behaviour 來規定之外,我們也可以使用巨集來幫使用套件的模組自動建立函式。
use
當有一個模組 use
我們的套件模組 MyMacro
時,Elixir 會執行 MyMacro.__using__/1
,
通常這個時候我們會在 MyMacro
模組裡面定義一個叫做 __using__/1
的巨集來接這個呼叫。
(__using__
, 的為一個變數為, use 的第二個 keyword list 變數)
首先是我們的 MyMacro
模組
defmodule MyMacro do
defmacro __using__(opts) do
function_name = opts[:name]
quote do
def unquote(function_name)() do
"FUWWA"
end
end
end
end
接著在 Demo 模組裡面使用 use
並帶入變數
defmodule Demo do
use MyMacro, name: :sunsun
end
因為我們的 __using__
巨集裡面的 quote
定義了根據傳入的名稱定義了新的函數
所以在 Demo 模組 use MyMacro, name: :sunsun
之後
我們就可以使用
Demo.sunsun
#=> "FUWWA"