当前位置: 首页 > 文档资料 > Elixir 中文教程 >

模块( Modules)

优质
小牛编辑
123浏览
2023-12-01

在Elixir中,我们将多个功能组合到模块中。 我们在前面的章节中已经使用了不同的模块,例如String模块,Bitwise模块,Tuple模块等。

为了在Elixir中创建我们自己的模块,我们使用defmodule宏。 我们使用def宏来定义该模块中的函数 -

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

在以下部分中,我们的示例将变得更长,并且在shell中键入它们可能会很棘手。 我们需要学习如何编译Elixir代码以及如何运行Elixir脚本。

Compilation

将模块写入文件总是很方便,因此可以编译和重用它们。 我们假设我们有一个名为math.ex的文件,其中包含以下内容 -

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

我们可以使用命令elixirc编译文件:

$ elixirc math.ex

这将生成一个名为Elixir.Math.beam的文件, Elixir.Math.beam包含已定义模块的字节码。 如果我们再次启动iex ,我们的模块定义将可用(假设iex在字节码文件所在的同一目录中启动)。 例如,

IO.puts(Math.sum(1, 2))

上述程序将产生以下结果 -

3

脚本模式

除了Elixir文件扩展名.ex ,Elixir还支持.exs文件以进行脚本编写。 Elixir以完全相同的方式处理两个文件,唯一的区别在于目标。 .ex文件用于编译,而.exs文件用于scripting 。 执行时,两个扩展都会编译并将其模块加载到内存中,尽管只有.ex文件以.beam文件的格式将其字节码写入磁盘。

例如,如果我们想在同一个文件中运行Math.sum ,我们可以按照以下方式使用.exs -

Math.exs

defmodule Math do
   def sum(a, b) do
      a + b
   end
end
IO.puts(Math.sum(1, 2))

我们可以使用Elixir命令运行它 -

$ elixir math.exs

上述程序将产生以下结果 -

3

该文件将在内存中编译并执行,结果打印“3”。 不会创建字节码文件。

模块嵌套

模块可以嵌套在Elixir中。 该语言的这一特性有助于我们以更好的方式组织我们的代码。 要创建嵌套模块,我们使用以下语法 -

defmodule Foo do
   #Foo module code here
   defmodule Bar do
      #Bar module code here
   end
end

上面给出的例子将定义两个模块: FooFoo.Bar 。 第二个可以在Foo作为Bar访问,只要它们在相同的词法范围内。 如果稍后将Bar模块移到Foo模块定义之外,则必须使用其全名(Foo.Bar)引用它,或者必须使用别名章节中讨论的别名指令设置别名。

Note - 在Elixir中,没有必要定义Foo模块以定义Foo.Bar模块,因为该语言将所有模块名称转换为原子。 您可以定义任意模块,而无需在链中定义任何模块。 例如,您可以定义Foo.Bar.Baz而无需定义FooFoo.Bar