說說erlang tuple和record結構

2021-09-02 03:23:55 字數 3878 閱讀 9098

erlang有兩種復合結構,tuple和list,兩者的區別是tuple子元素的個數是固定不變的,宣告後就不能改變了;而list是可變的,可以通過[h|t]來取出或插入新元素。record有點像c/c++裡面的結構體,實際上是語法糖,方便我們的開發,**彙編時轉成tuple表達形式。

tuple

tuple的表示方法如:

下面以例子說明erlang tuple及一些基本操作:

1> a = .

2> tuple_size(a).

23> is_tuple(a).

true

4> tuple_to_list(a).

[1,2]

5> element(1, a).

16> setelement(2, a, 3).

record

record有點像c/c++裡面的結構體,表示方法如:

-record(name, ).
下面以例子說明erlang record及一些基本操作:

%% shell下定義 record結構 person

%% 等效程式裡定義 -record(person, ).

7> rd(person, ).

person

8> a1 = #person.

#person

9> a2 = a1#person.

#person

%% record 一次賦值

10> x = #person.

#person

11> element(2, x).

112> setelement(2, x, "tom").

#person

14> p=#person{}.

#person

15> is_record(p,person).

true

16> #person.age.

317> #person.name.

2

tuple 和 record 有什麼關係?

record只是語言程式上的結構,方便我們的開發,在erlang編譯的時候會轉成tuple處理

%% shell下定義 record結構 person2

%% 等效程式裡定義 -record(person2, ).

23> rd(person2, ).

person2

24> a3 = #person2.

#person2

%% 模式匹配

25> = a3.

#person2

26> name.

"jimmy"

27> #person2 = a3.

#person2

28> name2.

"jimmy"

下面,以乙個簡單的例子,測試tuple和record的彙編**

-module(test).

-export([test/0]).

-record(person, ).

test() ->

a = ,

b = #person,

.

通過命令erlc -s test.erl 可以生成 test.s的彙編**..

]}.,,0}.

. ,} }, }.

return.

record_info/2

說到record,不得不提record_info/2,這個函式用以獲取record的資訊,原型:

record_info(type, record) -> integer() | list

type有兩種:size、fields

34> rd(person,).

person

35> record_info(fields, person).

[id,name]

36> record_info(size, person).

3

-module(tt).

-compile(export_all).

-record(person,).

fields() ->

record_info(fields, person).

size() ->

record_info(size, person).

erlc -s tt.erl

編譯這個模組得到 tt.s,這是其中的彙編碼:..

]}.,,0}.

.,}.

return...

]}.,,0}.

.,}.

return.

在編譯期就直接被erlang優化了

修改tuple結構

r16以後,erlang提供了2個介面用於修改tuple結構。

1、增加tuple元素

等效於 list_to_tuple(tuple_to_list(tuple1) ++ [term]),但效能比後者高

2、移除tuple元素

erlang:delete_element(index, tuple1)

> erlang:delete_element(2, ).

record 的模式匹配

record有兩種模式匹配的方法:

1> rd(person, ).

person

2> case #person of #person -> a; _ -> false end.

103> a.

104> #person = #person.

#person

5> b.

15

現在,順道討論下 record 模式匹配的本質。

1> rd(person, ).

person

2> #person{} =:= #person.

false

3> case #person of #person{} -> true; _ -> false end.

true

4> #person{} = #person.

#person

前面說到 record在執行期會編譯成tuple,所以第2點是判斷兩個tuple是否相同。

而第3點和第4點本質差別不大,只是執行了模式匹配,檢查tuple是否 3 個元素,且第乙個元素是原子person,不會判斷除其他元素值是否相等,但是如果像下面這樣寫就會匹配到其他元素了。

5> case #person of #person -> true; _ -> false end.

false

6> #person = #person.

** exception error: no match of right hand side value #person

有興趣的同學參照上面列印erlang模組彙編碼就可以找到答案了。

更新說明:

2014/10/30 補充了record函式 record_info/2的說明

2014/11/06 補充了record函式is_record/2等基本操作

2015/2/11 補充了兩個tuple結構修改函式

2015/3/4 補充了record的模式匹配

參考:

量化投資 說說R語言中幾個排序函式

在做資料統計 分析過程中,我們經常會遇到排序 搜尋這些常見的功能,對於計算機專業的要求就更進一步,不僅要會常見的資料排序,而且要考慮各種極端情況下的排序,以及排序效能,是否是最優解等等,我們這裡完全從金融工程角度去分析和理解r語言中的排序函式。r語言中經常用到的排序函式有三個 sort rank o...

說說分段和分頁

頁是資訊的物理單位,分頁是為實現離散分配方式,以消減記憶體的外零頭,提高記憶體的利用率 或者說,分頁僅僅是由於系統管理的需要,而不是使用者的需要。段是資訊的邏輯單位,它含有一組其意義相對完整的資訊。分段的目的是為了能更好的滿足使用者的需要。頁的大小固定且由系統確定,把邏輯位址劃分為頁號和頁內位址兩部...

說說Event和Listener和Adapter

仔細一查,發現的確是介面listener都有介面卡adapter,但是actionlistener沒有。因為這個介面只有乙個成員函式就是actionperformed 沒必要有adapter 然後查了一下api 幾乎大多數的都有,然後adapter主要implements於其listener和eve...