Elixir - 行為 (Behaviours)



在 Elixir(和 Erlang)中,行為是一種將元件的通用部分(成為行為模組)與特定部分(成為回撥模組)分離和抽象的方法。行為提供了一種方法來:

  • 定義一組必須由模組實現的函式。
  • 確保模組實現該集合中的所有函式。

如果需要,您可以將行為視為 Java 等面嚮物件語言中的介面:模組必須實現的一組函式簽名。

定義行為

讓我們考慮一個示例來建立我們自己的行為,然後使用此通用行為來建立模組。我們將定義一個行為,該行為用不同的語言向人們問好和道別。

defmodule GreetBehaviour do
   @callback say_hello(name :: string) :: nil
   @callback say_bye(name :: string) :: nil
end

@callback 指令用於列出採用模組需要定義的函式。它還指定引數的數量、型別和返回值。

採用行為

我們已經成功定義了一個行為。現在,我們將採用它並在多個模組中實現它。讓我們建立兩個模組,分別用英語和西班牙語實現此行為。

defmodule GreetBehaviour do
   @callback say_hello(name :: string) :: nil
   @callback say_bye(name :: string) :: nil
end

defmodule EnglishGreet do
   @behaviour GreetBehaviour
   def say_hello(name), do: IO.puts("Hello " <> name)
   def say_bye(name), do: IO.puts("Goodbye, " <> name)
end

defmodule SpanishGreet do
   @behaviour GreetBehaviour
   def say_hello(name), do: IO.puts("Hola " <> name)
   def say_bye(name), do: IO.puts("Adios " <> name)
end

EnglishGreet.say_hello("Ayush")
EnglishGreet.say_bye("Ayush")
SpanishGreet.say_hello("Ayush")
SpanishGreet.say_bye("Ayush")

執行上述程式時,會產生以下結果:

Hello Ayush
Goodbye, Ayush
Hola Ayush
Adios Ayush

正如您已經看到的那樣,我們使用模組中的@behaviour指令來採用行為。我們必須為所有模組定義行為中實現的所有函式。這大致可以認為等同於面嚮物件語言中的介面。

廣告
© . All rights reserved.