參考:
1:lua的table你可以先理解為既是乙個陣列也是乙個字典
2:table判空
function istableempty (t)
if t == nil or next (t) == nil then
return true
else
return false
endend
3:元表和__index
先是元表:
上乙個基本**example1.lua
local t1 =
local t2 =
local t3 = setmetatable(t1, t2)
print(t1.age)
print(t2.name)
print(t3.name)
print(t3.age)
-- conclusion: 返回值是他t1, t1, t2 沒有被改變
-- 元表是為了來做一些操作符過載,還有其他工作的
print("------")
local mt = {}
mt.__add = function(a, b)
return (a.v + b.v) / 2
endlocal t1 =
local t2 =
setmetatable(t1, mt)
print("a + b =", t1 + t2)
再是__index, example2.lua
local mt = {}
mt.__index = function(table, key)
print("call function with table and key")
endmt.__newindex = function(t,k,v)
print("call new index function")
endlocal t =
setmetatable(t, mt)
local temp = t.v
print(temp)
temp = t.a
print(temp)
print("----")
t.a = 20
"index": 索引 table[key]。 當 table 不是表或是表 table 中不存在key 這個鍵時,這個事件被觸發。 此時,會讀出 table 相應的元方法。儘管名字取成這樣, 這個事件的元方法其實可以是乙個函式也可以是一張表。 如果它是乙個函式,則以 table 和 key 作為引數呼叫它。如果它是一張表,最終的結果就是以 key 取索引這張表的結果。(這個索引過程是走常規的流程,而不是直接索引, 所以這次索引有可能引發另一次元方法。
"newindex": 索引賦值 table[key] = value 。 和索引事件類似,它發生在 table 不是表或是表 table 中不存在 key 這個鍵的時候。 此時,會讀出 table 相應的元方法。同索引過程那樣, 這個事件的元方法即可以是函式,也可以是一張表。 如果是乙個函式, 則以 table、 key、以及 value 為引數傳入。如果是一張表, lua 對這張表做索引賦值操作。 (這個索引過程是走常規的流程,而不是直接索引賦值, 所以這次索引賦值有可能引發另一次元方法。)一旦有了 "newindex" 元方法, lua 就不再做最初的賦值操作。(如果有必要,在元方法內部可以呼叫 rawset 來做賦值。
4:物件導向
-- meta class
shape =
-- 基礎類方法 new
function shape:new (o,side)
o = o or {}
-- 這有點像執行時繫結,在後面對self的修改,這個o都能接受到
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end-- 基礎類方法 printarea
function shape:printarea ()
print("面積為 ",self.area)
end-- 建立物件
myshape = shape:new(nil,10)
myshape:printarea()
print(myshape.area)
執行時繫結元表的證明
local mt =
local mtt =
--mt.__index =
mt.__index = mtt
mtt.a = 15
local t =
setmetatable(t, mt)
local temp = t.a
print(temp)
5:mt.__index = mt
local mt =
mt.__index = mt
mt.vv = 4
local t =
setmetatable(t, mt)
local temp = t.vv
print(temp)
print("------")
local mt1 =
mt.__index = function(table, key)
print("call function in __index")
endmt.vv = 4
local t =
setmetatable(t, mt)
temp = t.vv
print(temp)
6:繼承
7:table作為函式引數時,傳遞的是引用,在函式內對table的修改會對映到函式外的table,或者說乙個table的賦值操作,也是乙個引用傳遞
local t =
local tt = t
tt.a = 3
print(t.a)
--result
--3
LUA TABLE 函式庫(二) 實用筆記
一部分的table函式只對其陣列部分產生影響,而另一部分則對整個table均產生影響.下面會分開說明.table.concat table,sep,start,end concat是concatenate 連鎖,連線 的縮寫.table.concat 函式列出引數中指定table的陣列部分從star...
Vim 使用筆記
set hlsearch set nohlsearch 搜尋後清除上次的加亮 nohl nohlsearch 拷貝 很有用的一句話,規定了格式選項,讓它換行不自動空格 set formatoptions tcrqn set fo r set noautoindent 再 shift insert 正...
xemacs使用筆記
xemacs使用筆記 xemacs emacs的下一代,由lucid原創 from debian參考手冊.由於不知道什麼時候刪掉了emacs的乙個重要檔案.每次都沒法安裝好.突然發現了xemacs,於是決定使用看看.本人還是菜鳥,僅供交流 我使用的ubuntu系統,所以就直接apt get inst...