Erlang中的Record詳解

2022-09-20 12:45:13 字數 2578 閱讀 5384

在erlang內部只有兩種混合的資料型別:list和tuple,而這兩種都不支援命名evxzn訪問,所以如果沒有額外的庫的話想建立像php、ruby或python中的關聯陣列(ruby中的hash)是不可能的

在ruby中我可以這樣做:

複製** **如下:

server_opts =  

在erlang的語法級別不支援這種表達

為了避免這種限制,erlang虛擬機器提供了乙個偽資料型別,稱為record

record支援命名訪問,後面我們會看到為什麼我們稱之為「偽」資料型別

定義record

record更類似於c中的str而不是關聯陣列,後者必須一開始就定義好內容並且只能保持資料

這裡是乙個伺服器的連線選項的record例子:

複製** **如下:

-module(my_server). 

-record(server_opts, 

). 

% the rest of your code goes here. 

record使用-record指令來宣告,第乙個引數是record的名字,第二個引數是乙個tu程式設計客棧ple,tuple包含了re裡的field和預設值

在這裡我們定義了server_opts這個record,它有三個field:埠、ip和最大連線數

沒有預設的port,ip預設值為"127.0.0.1",max_connections預設值為10

建立record

record通過使用#符號來建立,下面是建立server_opts這個record的例項的合法方式:

複製** **如下:

opts1 = #server_opts. 

這段**建立了乙個server_opts record,port設定為80,其他field使用預設值

opts2 = #server_opts. 

這段**建立了乙個server_opts record,但是ip設定為"192.168.0.1"

簡而言之,當建立乙個record時,你可以包含任何field,省略的field將使用預設值

訪問record

record的訪問方式很笨拙,如果我想訪問port這個field,我可以這樣做:

複製** **如下:

opts = #server_opts, 

opts#server_opts.port 

每次你想訪問乙個record時你都必須包含record的名字,為什麼要這樣?

因為record不是真正的內部資料型別,它只是編譯器的小把戲。

在內部,record是tuple,如下:

複製** **如下:

編譯器將record的名字對映到tuple裡面

erlang虛擬機器記錄了record的定義,而編譯器將所有的record邏輯翻譯為tuple邏輯

因此,根本就沒有record型別,所以每次你訪問乙個record時你必須告訴erlang我們在用哪個record(為了編譯器爽,程式設計師變的很不爽)

更新record

更新record和建立record很類似:

複製** **如下:

opts = #server_opts, 

newopts = opts#server_opts. 

這裡首先建立乙個server_opts record

newopts = opts#建立了乙個opts的副本,並指定port為7000並繫結到newopts

匹配record和guard語句

不談模式匹配就不算erlang

讓我們來看看乙個例子:

複製** **如下:

handle(opts=#server_opts) -> 

% do special port 8080 stevxznuff 

handle(opts=#server_opts{} -> 

% default stuff 

guard語句和上面的類似,例如繫結小於1024的埠通常需要root許可權,所以我們可以這樣做:

複製** **如下:

handle(opts) when opts#server_opts.port <= 1024 -> 

% requires root access 

handle(opts=#server_opts{}) -> 

% doesn't require root access 

使用record

在我使用erlang的有限的時間裡,我發現record主要用在兩種場景

首先,record用來儲存狀態,特別是在使用gen_server的beh**iour時

由於erlang不能全域性保持狀態,所以狀態必須在方法之前傳來傳去

然後,record可以用來儲存配置選項,這可以認為是第一點的子集

儘管如此,record也有一些限制,最明顯的是不能在執行時新增和刪除field,這和c的struct一樣,record的結構必須預先定義

如果你想在執行時新增和刪除field,或者你在執行時才能確定有哪些field,這時你應該使用dict而不是record

本文標題: erlang中的record詳解

本文位址:

Oracle中的記錄 Record

oracle中可以通過定義記錄來實現一些特定的程式設計要求,通過記錄的形式也可以簡化解決問題的方法。由單行多列的標量構成的復合結構。可以看做是一種使用者自定義資料型別。組成類似於多維陣列。將乙個或多個標量封裝成乙個物件進行操作。是一種臨時復合物件型別。記錄可以直接賦值。record1 record2...

erlang中的spawn函式

spawn fun pid 引數型別 fun function 引數為空的函式 返回型別 程序pid 說明 生成乙個由fun函式啟動的 引數為空的新程序,並返回程序的pid。spawn node,fun pid 引數型別 node node 節點 fun function 引數為空的函式 返回型別 ...

Erlang中的程序表示

test1 pid spawn fun receive stop void end end pid stop.test2 register tut,spawn fun receive stop void end end tut stop.pid 的生成 pid表示為,可以通過list to pid ...