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
erlc -s tt.erl34> 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).
編譯這個模組得到 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...