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)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。