📜  Elixir-模块

📅  最后修改于: 2020-11-04 05:27:59             🧑  作者: Mango


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

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

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

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

汇编

将模块写入文件总是很方便的,以便可以对其进行编译和重用。让我们假设我们有一个名为math.ex的文件,其内容如下:

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

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

$ elixirc math.ex

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

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

上面的程序将产生以下结果-

3

脚本模式

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

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

数学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)进行引用,或者必须使用别名一章中讨论的alias指令设置别名。

–在Elixir中,无需定义Foo模块即可定义Foo.Bar模块,因为该语言会将所有模块名称转换为原子。您可以定义任意嵌套的模块,而无需定义链中的任何模块。例如,您可以定义Foo.Bar.Baz而不定义FooFoo.Bar