lua table使用筆記

2021-08-28 01:17:40 字數 3099 閱讀 3851

參考:

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...