当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Kernel.defmodule用法及代码示例


Elixir语言中 Kernel.defmodule 相关用法介绍如下。

用法:

defmodule(alias, do_block)
(宏)

用给定的内容定义一个由名称给定的模块。

该宏定义了一个以给定alias 作为其名称并具有给定内容的模块。它返回一个包含四个元素的元组:

  • :module
  • 模块名称
  • 模块的二进制内容
  • 评估内容块的结果

例子

defmodule Number do
  def one, do: 1
  def two, do: 2
end
#=> {:module, Number, <<70, 79, 82, ...>>, {:two, 0}}

Number.one()
#=> 1

Number.two()
#=> 2

嵌套

将一个模块嵌套在另一个模块中会影响嵌套模块的名称:

defmodule Foo do
  defmodule Bar do
  end
end

在上面的示例中,创建了两个模块 - FooFoo.Bar。嵌套时,Elixir 会自动为内部模块创建一个别名,允许第二个模块 Foo.Bar 在定义它的相同词法范围(Foo 模块)中作为 Bar 访问。仅当嵌套模块通过别名定义时才会发生这种情况。

如果Foo.Bar 模块被移动到其他地方,Foo 模块中对Bar 的引用需要更新为完全限定名称(Foo.Bar);或者必须借助 Kernel.SpecialForms.alias/2 Foo 模块中显式设置别名。

defmodule Foo.Bar do
  # code
end

defmodule Foo do
  alias Foo.Bar
  # code here can refer to "Foo.Bar" as just "Bar"
end

动态名称

Elixir 模块名称可以动态生成。这在使用宏时非常有用。例如,可以写:

defmodule String.to_atom("Foo#{1}") do
  # contents ...
end

只要作为第一个参数传递给 defmodule/2 的表达式计算为原子,Elixir 将接受任何模块名称。请注意,当使用动态名称时,Elixir 不会将名称嵌套在当前模块下,也不会自动设置别名。

保留的模块名称

如果您尝试定义一个已经存在的模块,您将收到一条警告,指出模块已被重新定义。

Elixir 目前还没有实现一些模块,但将来可能会实现。这些模块是保留的,定义它们会导致编译错误:

defmodule Any do
  # code
end
** (CompileError) iex:1: module Any is reserved and cannot be defined

Elixir 保留以下模块名称:ElixirAnyBitStringPIDReference

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Kernel.defmodule(alias, do_block)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。