📅  最后修改于: 2020-11-04 08:32:04             🧑  作者: Mango
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指令来采取行为。我们必须为所有子模块定义在行为中实现的所有功能。可以粗略地认为这等同于OOP语言中的接口。