rawset/rawget:對」原始的」表進行直接的賦值/取值操作。當操作table時,如果我們有以下需求:
在將rawset和rawget之前,我們先來看看matetable。lua中每種型別的值都有都有他的預設操作方式, 如, 數字可以做加減乘除等操作, 字串可以做連線操作, 函式可以做呼叫操作, 表可以做表項的取值賦值操作. 他們都遵循這些操作的預設邏輯執行, 而這些操作可以通過metatable來改變。這裡我只講table的mettable。 而__index和__newindex與rawget和rawset關係比較密切。如下:t = {} -- 普通表
mt = {} -- 元表,現在暫時什麼也沒有
setmetatable(t, mt) -- 把mt設為t的元表
getmetatable(t) -- 這回返回mt
元表裡最常用的索引可能是__index,它可以包含表或函式。當你通過索引來訪問表, 不管它是什麼(例如t[4], t.foo, 和t[「foo」]), 以及並沒有分配索引的值時,lua 會先在查詢已有的索引,接著查詢表的metatable裡(如果它有)查詢__index 索引。 如果__index 包含了表, lua會在__index包含的表裡查詢索引。 舉例如下:
1.__index為表
other =
t = setmetatable({}, )
print("value foo = ", tab_1["foo"]) -- 0
print("value moo = ", tab_1["moo"]) -- nil
2.__index為函式
tab_1 = setmetatable({}, )
print("value foo = ", tab_1["foo"]) -- 0
print("value moo = ", tab_1["moo"]) -- nil
和__index類似,可以包含函式和表.當你給表中不存在的值賦值時,lua會在metatable裡查詢__newindex,呼叫順序和 __index一樣。舉例如下:1.__newindex為表
local other = {}
local tab = setmetatable({}, )
tab.c = 3
print("value tab.c = ", tab.c) -- nil
print("value other.c = ", other.c) -- 3
2.__newindex為函式
local tab_2 = setmetatable({},)
tab_2.c = 3
-- 報錯,stack overflow
3.__newindex為rawset函式
local tab_3 = setmetatable({},)
tab_3.a = 11;
print("value a = ", tab_3["a"])
根據引數table和index獲得真正的值table[index],也就是說根本不會呼叫到元表,其中引數table必須是乙個表,而引數index可以使是任何值。舉例如下:local tab =
local mt =
print("value tab.c = ", tab.c) --c
print("value tab.x = ", tab.x) -- nil
setmetatable(tab, ) --設元表
print("metatable value tab.c = ", tab.c) --c
print("metatable value tab.x = ", tab.x) -- 1
print("not use metatable value tab.c = ", rawget(tab,"c")) -- c
print("not use metatable value tab.x = ", rawget(tab, "x")) -- nil
在不呼叫元表的情況下,給table[index]賦值為value,其中引數table必須是乙個表,而引數index可以是不為nil的任何值。舉例如下:local tab_3 = setmetatable({},)
tab_3.a = 11;
print("value a = ", tab_3["a"])
Lua學習之閉合函式
閉合函式 closure 看lua程式設定這本書的時候,其實感覺也就lua也就那樣,直到看到閉合函式這乙個塊 首先來說說函式,函式在lua中屬於第一類值,其實對於函式而言,function a end 和 a function end 是等價的,乙個函式的定義實際上就是一條賦值語句,這條語句首先建立...
Lua資料之函式(特殊)
區域性函式 由於全域性變數一般會汙染全域性名字空間,同時也有效能損耗 即查詢全域性環境表的開銷 因此我們應當盡量使用 區域性函式 其記法是類似的,只是開頭加上 local 修飾符 local function function name arc body end由於函式定義等價於變數賦值,我們也可以...
lua函式之搜尋變數
lua中的每個函式會被lua虛擬機器解析儲存在funcstate結構體中 乙個lua檔案本身也會對應乙個funcstate結構 每個funcstate有乙個prev指標指向它的父函式 最高層是某個lua檔案,即全域性環境,改層的prev指標為null lua的變數分三種型別 全域性變數 區域性變數和...