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指令来采用行为。我们必须为所有模块定义行为中实现的所有函数。这大致可以认为等同于面向对象语言中的接口。

广告