一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Erlang - Erlang中的Record詳解

Erlang中的Record詳解

2020-05-29 14:03Erlang教程網 Erlang

這篇文章主要介紹了Erlang中的Record詳解,本文講解了定義Record、創(chuàng)建Record、訪問Record、更新Record、匹配Record和Guard語句、使用Record等內容,需要的朋友可以參考下

在Erlang內部只有兩種混合的數據類型:List和Tuple,而這兩種都不支持命名訪問,所以如果沒有額外的庫的話想創(chuàng)建像PHP、Ruby或Python中的關聯(lián)數組(Ruby中的Hash)是不可能的

在Ruby中我可以這樣做:

復制代碼 代碼如下:

server_opts = {:port => 8080, :ip => '127.0.0.1', :max_connections => 10} 

 

在Erlang的語法級別不支持這種表達

為了避免這種限制,Erlang虛擬機提供了一個偽數據類型,稱為Record
Record支持命名訪問,后面我們會看到為什么我們稱之為“偽”數據類型

定義Record

Record更類似于C中的struct,而不是關聯(lián)數組,后者必須一開始就定義好內容并且只能保持數據
這里是一個服務器的連接選項的Record例子:

復制代碼 代碼如下:

-module(my_server). 
 
-record(server_opts, 
  {port, 
  ip="127.0.0.1", 
  max_connections=10}). 
 
% The rest of your code goes here. 


Record使用-record指令來聲明,第一個參數是Record的名字,第二個參數是一個Tuple,Tuple包含了Record里的field和默認值
在這里我們定義了server_opts這個Record,它有三個field:端口、IP和最大連接數
沒有默認的port,ip默認值為"127.0.0.1",max_connections默認值為10

 

創(chuàng)建Record

Record通過使用#符號來創(chuàng)建,下面是創(chuàng)建server_opts這個Record的實例的合法方式:

復制代碼 代碼如下:

Opts1 = #server_opts{port=80}. 


這段代碼創(chuàng)建了一個server_opts Record,port設置為80,其他field使用默認值
Opts2 = #server_opts{port=80, ip="192.168.0.1"}. 

 

這段代碼創(chuàng)建了一個server_opts Record,但是ip設置為"192.168.0.1"

簡而言之,當創(chuàng)建一個Record時,你可以包含任何field,省略的field將使用默認值

訪問Record

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

復制代碼 代碼如下:

Opts = #server_opts{port=80, ip="192.168.0.1"}, 
Opts#server_opts.port 


每次你想訪問一個Record時你都必須包含Record的名字,為什么要這樣?
因為Record不是真正的內部數據類型,它只是編譯器的小把戲。

 

在內部,Record是Tuple,如下:

復制代碼 代碼如下:

{server_opts, 80, "127.0.0.1", 10} 


編譯器將Record的名字映射到Tuple里面
Erlang虛擬機記錄了Record的定義,而編譯器將所有的Record邏輯翻譯為Tuple邏輯
因此,根本就沒有Record類型,所以每次你訪問一個Record時你必須告訴Erlang我們在用哪個Record(為了編譯器爽,程序員變的很不爽)

 

更新Record

更新Record和創(chuàng)建Record很類似:

復制代碼 代碼如下:

Opts = #server_opts{port=80, ip="192.168.0.1"}, 
NewOpts = Opts#server_opts{port=7000}. 


這里首先創(chuàng)建一個server_opts Record

 

NewOpts = Opts#{port=7000}創(chuàng)建了一個Opts的副本,并指定port為7000并綁定到NewOpts

匹配Record和Guard語句

不談模式匹配就不算Erlang
讓我們來看看一個例子:

復制代碼 代碼如下:

handle(Opts=#server_opts{port=8000}) -> 
  % do special port 8080 stuff 
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的有限的時間里,我發(fā)現Record主要用在兩種場景
首先,Record用來保存狀態(tài),特別是在使用gen_server的behaviour時
由于Erlang不能全局保持狀態(tài),所以狀態(tài)必須在方法之前傳來傳去
然后,Record可以用來保存配置選項,這可以認為是第一點的子集
盡管如此,Record也有一些限制,最明顯的是不能在運行時添加和刪除field,這和C的struct一樣,Record的結構必須預先定義
如果你想在運行時添加和刪除field,或者你在運行時才能確定有哪些field,這時你應該使用dict而不是Record

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜亚洲精品久久久久久 | 高清在线观看免费入口 | 欧美巨胸 | 天天干夜夜噜 | 精品四虎 | 2012在线观看免费视频大全 | 日本欧美不卡一区二区三区在线 | 午夜无码片在线观看影院 | 无码射肉在线播放视频 | 暖暖 免费 高清 日本 在线 | 久久婷婷五月综合色丁香 | 四虎成人永久地址 | 国产一级一级一级成人毛片 | 久久九九久精品国产尤物 | 精品九九视频 | 午夜精品久久久久久久99蜜桃 | 欧美日韩一区视频 | free性欧洲 | 暖暖的视频完整视频韩国免费 | 成人免费国产欧美日韩你懂的 | 114毛片免费观看网站 | a毛片在线免费观看 | 好大好湿好硬好爽好深免费视频 | 亚欧洲乱码专区视频 | 欧美大屁屁 | 动漫白丝袜美女羞羞 | 免看一级a一片成人123 | 亚洲国产精品久久久久久网站 | 国产日韩欧美综合一区二区三区 | 国产在线精品亚洲第一区香蕉 | 狠狠干综合网 | 成人看片免费无限观看视频 | 亚洲视频一区二区在线观看 | 成人国产在线视频 | 女同69式互添在线观看免费 | 偷拍自拍校园春色 | 日本激情网| 日韩精品久久不卡中文字幕 | 国产好深好硬好爽我还要视频 | 精品在线观看一区 | 日本福利网 |