1.概述
rawset
2.例項
test.lua-----------------------
window = {}
window.prototype =
window.mt = {}
function window.new(o)
setmetatable(o ,window.mt)
return o
endwindow.mt.__index = window.prototype
window.mt.__newindex = function (table ,key ,value)
if key == "wangbin" then
rawset(table ,"wangbin" ,"yes,i am")
endend
w = window.new
w.wangbin = "55"
print(w.wangbin)
然後,我們可以看到列印資訊是:yes,i am
原本賦值的地方是w.wangbin = "55",但是結果卻是 yes,i am。
這裡就改變了元表的行為模式。
3.分析
3.1.
__index是當我們訪問乙個表中的元素不存在時,則會觸發去尋找__index元方法,如果不存在,
則返回nil,如果存在,則返回結果。
test2.lua-----------------------
window = {}
window.prototype =
window.mt = {}
function window.new(o)
setmetatable(o ,window.mt)
return o
endwindow.mt.__index = function (t ,key)
-- body
return 1000
endw = window.new
print(w.wangbin)
列印結果是:1000。這裡可以看出,我們在new的時候,w這個表裡其實沒有wangbin這個元素的,
我們重寫了元表中的__index,使其返回1000,意思是:如果你要尋找的元素,該表中沒有,那麼
預設返回1000。
3.2.
__newindex:當給你的表中不存在的值進行賦值時,lua直譯器則會尋找__newindex元方法,
發現存在該方法,則執行該方法進行賦值,注意,是使用rawset來進行賦值,至於原因,後
面會講到。
test3.lua-----------------------
window.mt = {}
function window.new(o)
setmetatable(o ,window.mt)
return o
endwindow.mt.__index = function (t ,key)
return 1000
endwindow.mt.__newindex = function (table ,key ,value)
if key == "wangbin" then
rawset(table ,"wangbin" ,"yes,i am")
endend
w = window.new
w.wangbin = "55"
print(w.wangbin)
ok,這裡的列印結果是:yes,i am。w這個表裡本來沒有wangbin這個元素的,我們重寫了元表
中__newindex,並在__newindex方法中重新進行賦值操作,然後,我們對這個本不存在的原素
w.wangbin進行賦值時,執行__newindex方法的賦值操作,最後,列印結果便是:yes,i am
3.3.
rawget是為了繞過__index而出現的,直接點,就是讓__index方法的重寫無效。
test4.lua-----------------------
window = {}
window.prototype =
window.mt = {}
function window.new(o)
setmetatable(o ,window.mt)
return o
endwindow.mt.__index = function (t ,key)
return 1000
endwindow.mt.__newindex = function (table ,key ,value)
if key == "wangbin" then
rawset(table ,"wangbin" ,"yes,i am")
endend
w = window.new
print(rawget(w ,w.wangbin))
列印結果是:nil。這裡的元表中__index函式就不再起作用了。
但是rawset呢,起什麼作用呢?我們再來執行一段**。
test5.lua-----------------------
window = {}
window.prototype =
window.mt = {}
function window.new(o)
setmetatable(o ,window.mt)
return o
endwindow.mt.__index = function (t ,key)
return 1000
endwindow.mt.__newindex = function (table ,key ,value)
table.key = "yes,i am"
endw = window.new
w.wangbin = "55"
然後我們的程式就stack overflow了。可見,程式陷入了死迴圈。
因為w.wangbin這個元素本來就不存在表中,然後這裡不斷執行進入__newindex,陷入了死迴圈。
rawset在這裡就是重新建立了乙個"wangbin"元素插入到table中。
Lua知識點 基礎 setfenv
1.概述 當我們在全域性環境中定義變數時經常會有命名衝突,尤其是在使用一些庫的時候,變數宣告 可能會發生覆蓋,這時候就需要乙個非全域性的環境來解決這問題。setfenv函式可以滿足我們 的需求。所謂函式的環境,其實乙個環境就是乙個表,該函式被限定為只能訪問該表中的域,或在函 數體內自己定義的變數。1...
LUA入門基礎知識點
lua執行的每段 例如乙個源 檔案或在互動模式中輸入一行 都可以稱為乙個程式塊。乙個程式塊也就是一連串的語句或者是命令。另外和c不同的是,c中的沒行語句在結束的時候都要輸入英文符號的分好作為結束標誌,但是在lua中,幾條連續的lua語句之間並不需要分隔符,當然也可以出現。例如 a 1 b a 2 a...
初學Lua知識點
1.變數 變數沒有預定義的型別 每乙個變數都可能包含任一種型別的值 nillua 中特殊的型別 乙個全域性型別沒有被賦值以前預設值為 nil,給全域性變數付 nil可以刪除該變數 boolean兩個取值 false 和true.但 lua中所有值都可以作為條件 在控制結構的條件中除了 false 和...