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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 3d动漫免费 | 免费一级夫妻a | 三级黄色片在线免费观看 | 国产成人永久免费视 | 美国videos | 国产伦精品一区二区三区免费迷 | 日韩精品视频美在线精品视频 | 嗯啊视频在线观看 | 国产成人免费高清激情视频 | 日韩在线视频在线 | 亚洲成人网在线 | 嫩草影院永久入口在线观看 | 91视频免费观看网站 | 国产成人综合亚洲一区 | 免费日本视频 | 色综合九九 | 国产黄频在线观看 | www.亚洲天堂 | 免费看视频高清在线观看 | www.亚洲色图 | 欧美一级特黄刺激大片视频 | 黑人video粗暴日本 | blacked黑人hd2021 bestialityvideo另类 | 91aaa免费免费国产在线观看 | 四虎影视在线影院在线观看 | 涩情主播在线翻车 | 男人猛激烈吃奶gif动态图 | 国产做a爰片久久毛片 | 久久er国产免费精品 | 我的男友是消防员在线观看 | 大象视频污 | 精品久久99麻豆蜜桃666 | 欧美18一videos极品 | 国产精品四虎在线观看免费 | 国产露脸对白刺激3p在线 | 3x免费高清视频 | 蜜桃久久久亚洲精品成人 | 视频污版 | 欧美干b视频 | 99热在这里只有精品 | 精品一区二区三区 不卡高清 |