Lua知識點 基礎 rawset

2021-07-16 05:21:06 字數 3047 閱讀 9630

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