當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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