Elixir - 行为
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 指令的行为。 我们必须为所有child子模块的行为定义所有实现的函数。 这大致可以认为相当于OOP语言中的接口。