📅  最后修改于: 2020-11-04 08:26:10             🧑  作者: Mango
为了促进软件重用,Elixir提供了三个指令-别名,require和import 。它还提供了一个称为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
现在让我们详细了解每个指令。
使用别名指令,可以为任何给定的模块名称设置别名。例如,如果要为String模块赋予别名“ Str” ,则只需编写-
alias String, as: Str
IO.puts(Str.length("Hello"))
上面的程序产生以下结果-
5
别名是考虑到字符串模块海峡。现在,当我们使用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 。
通常,除非要使用该模块中可用的宏,否则在使用之前不需要该模块。尝试调用未加载的宏将引发错误。请注意,就像别名指令一样, require也在词法范围内。在下一章中,我们将更多地讨论宏。
我们使用import指令轻松访问其他模块中的函数或宏,而无需使用标准名称。例如,如果我们想多次使用“列表”模块中的重复函数,则可以简单地将其导入。
import List, only: [duplicate: 2]
在这种情况下,我们仅从List导入函数重复项(参数列表长度为2)。虽然:only是可选的,但建议使用它,以避免将给定模块的所有功能导入名称空间内。 :except也可以作为选项提供,以便将模块中除功能列表以外的所有内容导入。
import指令还支持:macros和:function赋予: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
使用模块首先需要该模块,然后调用模块上的__using__宏。 Elixir具有强大的元编程功能,并且具有在编译时生成代码的宏。在上面的实例中,将调用_ _using__宏,并将代码注入到我们的本地上下文中。本地上下文是在编译时调用use宏的位置。