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}
在值中使用匿名函數定義提取的記錄
如果記錄在默認值中定義了匿名函數,則會引發
。在從使用匿名函數作為默認值的 Erlang 庫中提取記錄後定義記錄時,可能會無意中發生這種情況。ArgumentError
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 Record.extract用法及代碼示例
- Elixir Record.is_record用法及代碼示例
- Elixir Record用法及代碼示例
- Elixir Registry.count_match用法及代碼示例
- Elixir Registry.lookup用法及代碼示例
- Elixir Registry.unregister_match用法及代碼示例
- Elixir Regex.run用法及代碼示例
- Elixir Regex.names用法及代碼示例
- Elixir Registry.register用法及代碼示例
- Elixir Registry用法及代碼示例
- Elixir Registry.values用法及代碼示例
- Elixir Registry.put_meta用法及代碼示例
- Elixir Regex.named_captures用法及代碼示例
- Elixir Registry.keys用法及代碼示例
- Elixir Regex.match?用法及代碼示例
- Elixir Registry.start_link用法及代碼示例
- Elixir Registry.unregister用法及代碼示例
- Elixir Registry.delete_meta用法及代碼示例
- Elixir Registry.count用法及代碼示例
- Elixir Registry.meta用法及代碼示例
- Elixir Registry.select用法及代碼示例
- Elixir Registry.update_value用法及代碼示例
- Elixir Registry.match用法及代碼示例
- Elixir Regex.escape用法及代碼示例
- Elixir Regex用法及代碼示例
注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Record.defrecord(name, tag \\ nil, kv)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。