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


Elixir Record.defrecord用法及代碼示例


Elixir語言中 Record.defrecord 相關用法介紹如下。

用法:

defrecord(name, tag \\ nil, kv)
(宏)

定義一組宏以在記錄上創建、訪問和模式匹配。

生成的宏的名稱將是name(它必須是一個原子)。 tag 也是一個原子,用作記錄的"tag"(即記錄元組的第一個元素);默認情況下(如果 nil ),它與 name 相同。 kv 是新記錄的name: default_value 字段的關鍵字列表。

生成以下宏:

  • name/0 使用所有字段的默認值創建新記錄
  • name/1 使用給定字段和值創建新記錄,獲取記錄中給定字段的從零開始的索引或將給定記錄轉換為關鍵字列表
  • name/2 使用給定字段和值更新現有記錄或訪問給定記錄中的給定字段

所有這些宏都是公共宏(由 defmacro 定義)。

有關如何使用這些宏的示例,請參閱"Examples" 部分。

例子

defmodule User do
  require Record
  Record.defrecord(:user, name: "meg", age: "25")
end

在上麵的示例中,將定義一組名為 user 但具有不同參數的宏來操作基礎記錄。

# Import the module to make the user macros locally available
import User

# To create records
record = user()        #=> {:user, "meg", 25}
record = user(age: 26) #=> {:user, "meg", 26}

# To get a field from the record
user(record, :name) #=> "meg"

# To update the record
user(record, age: 26) #=> {:user, "meg", 26}

# To get the zero-based index of the field in record tuple
# (index 0 is occupied by the record "tag")
user(:name) #=> 1

# Convert a record to a keyword list
user(record) #=> [name: "meg", age: 26]

生成的宏也可用於對記錄進行模式匹配並在匹配期間綁定變量:

record = user() #=> {:user, "meg", 25}

user(name: name) = record
name #=> "meg"

默認情況下,Elixir 使用記錄名稱作為元組的第一個元素("tag")。但是,在定義記錄時可以指定不同的標記,如下例所示,其中我們使用 Customer 作為 defrecord/3 的第二個參數:

defmodule User do
  require Record
  Record.defrecord(:user, Customer, name: nil)
end

require User
User.user() #=> {Customer, nil}

在值中使用匿名函數定義提取的記錄

如果記錄在默認值中定義了匿名函數,則會引發 ArgumentError 。在從使用匿名函數作為默認值的 Erlang 庫中提取記錄後定義記錄時,可能會無意中發生這種情況。

Record.defrecord(:my_rec, Record.extract(...))
** (ArgumentError) invalid value for record field fun_field,
    cannot escape #Function<12.90072148/2 in :erl_eval.expr/5>.

要解決此錯誤,請使用您自己的 &M.f;/a 函數重新定義該字段,如下所示:

defmodule MyRec do
  require Record
  Record.defrecord(:my_rec, Record.extract(...) |> Keyword.merge(fun_field: &__MODULE__.foo/2))
  def foo(bar, baz), do: IO.inspect({bar, baz})
end

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Record.defrecord(name, tag \\ nil, kv)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。