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
在上面的示例中,创建了两个模块 - Foo
和 Foo.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
只要作为第一个参数传递给
的表达式计算为原子,Elixir 将接受任何模块名称。请注意,当使用动态名称时,Elixir 不会将名称嵌套在当前模块下,也不会自动设置别名。defmodule/2
保留的模块名称
如果您尝试定义一个已经存在的模块,您将收到一条警告,指出模块已被重新定义。
Elixir 目前还没有实现一些模块,但将来可能会实现。这些模块是保留的,定义它们会导致编译错误:
defmodule Any do
# code
end
** (CompileError) iex:1: module Any is reserved and cannot be defined
Elixir 保留以下模块名称:Elixir
、Any
、BitString
、PID
和 Reference
。
相关用法
- Elixir Kernel.defmacro用法及代码示例
- Elixir Kernel.defexception用法及代码示例
- Elixir Kernel.defdelegate用法及代码示例
- Elixir Kernel.defguard用法及代码示例
- Elixir Kernel.defoverridable用法及代码示例
- Elixir Kernel.defstruct用法及代码示例
- Elixir Kernel.defp用法及代码示例
- Elixir Kernel.def用法及代码示例
- Elixir Kernel.destructure用法及代码示例
- Elixir Kernel.div用法及代码示例
- Elixir Kernel.SpecialForms.case用法及代码示例
- Elixir Kernel.round用法及代码示例
- Elixir Kernel.left / right用法及代码示例
- Elixir Kernel.put_in用法及代码示例
- Elixir Kernel.tl用法及代码示例
- Elixir Kernel.left - right用法及代码示例
- Elixir Kernel.tuple_size用法及代码示例
- Elixir Kernel.to_charlist用法及代码示例
- Elixir Kernel.base ** exponent用法及代码示例
- Elixir Kernel.left !== right用法及代码示例
- Elixir Kernel.if用法及代码示例
- Elixir Kernel.spawn_monitor用法及代码示例
- Elixir Kernel.to_string用法及代码示例
- Elixir Kernel.length用法及代码示例
- Elixir Kernel.first..last用法及代码示例
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Kernel.defmodule(alias, do_block)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。