回調(callback)是編程中常常會用到的一種模式,在 elixir 中咱們一般經過假定一個些模塊裏面包含了一些符合特定函數簽名的函數定義,或者說這個模塊實現了某種 behaviour,來進行回調編程。這種編程模式的好處是能夠將回調的實現模塊進行升級或者替換,而不改變回調的函數簽名,從而不破壞調用者的代碼。編程
在 Supervisor 啓動時,咱們須要提供 children 模塊的列表,這裏其實也能夠使用回調:child_spec/1
來實現。咱們來測試一下:設計模式
defmodule O1 do # 咱們僞裝啓動了一個進程 def fake_start(arg) do IO.puts("Starting with arg: #{inspect(arg)}!") {:ok, self()} end # 這裏是兩個 Child 的模塊,都實現了 `child_spec/1` 回調 defmodule Alice do def child_spec(arg) do %{ id: __MODULE__, start: {O1, :fake_start, [arg]} } end end defmodule Carl do def child_spec(arg) do %{ id: __MODULE__, start: {O1, :fake_start, [arg]} } end end def test do children = [ # 第二個元素便是傳給啓動函數的參數 {Alice, "hi"}, # 默認的參數是 `[]` Carl ] Supervisor.start_link(children, strategy: :one_for_one) end end
運行一下,能夠看到 Supervisor 啓動成功。回調編程是一種簡單且被普遍應用的設計模式。在 erlang 和 elixir 中,更是被應用到了極致。函數
iex(5)> O1.test Starting with arg: "hi"! Starting with arg: []! {:ok, #PID<0.345.0>}