Elixir - 别名


为了方便软件重用,Elixir 提供了三个指令——alias 、requireimport。它还提供了一个名为 use 的宏,总结如下 -

# Alias the module so it can be called as Bar instead of Foo.Bar
alias Foo.Bar, as: Bar

# Ensure the module is compiled and available (usually for macros)
require Foo

# Import functions from Foo so they can be called without the `Foo.` prefix
import Foo

# Invokes the custom code defined in Foo as an extension point
use Foo

现在让我们详细了解每个指令。

别名

alias 指令允许您为任何给定的模块名称设置别名。例如,如果您想为 String 模块指定别名“Str” ,您可以简单地编写 -

alias String, as: Str
IO.puts(Str.length("Hello"))

上述程序生成以下结果 -

5

String模块的别名为Str。现在,当我们使用 Str 文字调用任何函数时,它实际上引用了String模块。当我们使用很长的模块名称并希望在当前范围内用较短的模块名称替换它们时,这非常有用。

注意- 别名必须以大写字母开头。

别名仅在调用它们的词法范围内有效。例如,如果文件中有 2 个模块并在其中一个模块中创建别名,则在第二个模块中将无法访问该别名。

如果您将内置模块的名称(例如 String 或 Tuple)作为其他模块的别名,以访问内置模块,则需要在其前面加上“ Elixir”。。例如,

alias List, as: String
#Now when we use String we are actually using List.
#To use the string module: 
IO.puts(Elixir.String.length("Hello"))

当上面的程序运行时,它会生成以下结果 -

5

要求

Elixir 提供宏作为元编程(编写生成代码的代码)的机制。

宏是在编译时执行和扩展的代码块。这意味着,为了使用宏,我们需要保证其模块和实现在编译期间可用。这是通过require指令完成的。

Integer.is_odd(3)

当上面的程序运行时,它将生成以下结果 -

** (CompileError) iex:1: you must require Integer before invoking the macro Integer.is_odd/1

在 Elixir 中,Integer.is_odd被定义为。该宏可以用作守卫。这意味着,为了调用Integer.is_odd,我们需要 Integer 模块。

使用require Integer函数并运行程序,如下所示。

require Integer
Integer.is_odd(3)

这次程序将运行并产生输出:true

一般来说,在使用之前不需要模块,除非我们想使用该模块中可用的宏。尝试调用未加载的宏将引发错误。请注意,与 alias 指令一样,require 也是词法作用域的。我们将在后面的章节中详细讨论宏。

进口

我们使用import指令轻松访问其他模块中的函数或宏,而无需使用完全限定名称。例如,如果我们想多次使用 List 模块中的重复函数,我们可以简单地导入它。

import List, only: [duplicate: 2]

在本例中,我们仅从 List 导入函数重复(参数列表长度为 2)。尽管:only是可选的,但建议使用它,以避免导入命名空间内给定模块的所有函数。:except也可以作为选项给出,以便导入模块中除函数列表之外的所有内容。

import指令还支持将: macros:functions赋予:only。例如,要导入所有宏,用户可以编写 -

import Integer, only: :macros

请注意,导入也像 require 和 alias 指令一样具有词法范围。另请注意,“导入”模块也“需要它”

使用

虽然use不是指令,但它是与require紧密相关的宏,它允许您在当前上下文中使用模块。开发人员经常使用 use 宏将外部功能引入当前词法范围(通常是模块)。让我们通过一个例子来理解 use 指令 -

defmodule Example do 
   use Feature, option: :value 
end 

Use 是一个宏,将上面的内容转换为 -

defmodule Example do
   require Feature
   Feature.__using__(option: :value)
end

use Module首先需要该模块,然后调用Module 上的__using__宏。Elixir 具有强大的元编程功能,并且具有在编译时生成代码的宏。在上面的实例中调用了__using__宏,并将代码注入到我们的本地上下文中本地上下文是编译时调用use 宏的地方。