rawget和rawset的作用

2021-08-21 12:32:58 字數 1089 閱讀 4605

在lua中有時候會遇到rawget  和 rawset 這2個函式,實際這2個函式的意思就是對錶的訪問和賦值 不使用元表的元方法.如下**:

class = {}

class.mt = {}

function class.new(o)

local instance = o or {}

setmetatable(instance,class.mt)

return instance

endclass.mt.__index = function(t, key)

return "www.fgreen.org"

endclass.mt.__newindex = function(t, key , value)

if key == "fgreen" then

rawset(t, key, value) --原始操作不使用元表方法

--t.fgreen = value    --會使用元表__newindex方法

endendw = class.new({})

print(rawget(w,"fgreen")) --第一次列印輸出

print(w.fgreen)

w.fgreen = "nval"

print(w.fgreen)

輸出結果:

可以看到第一次列印輸出是nil 說明使用rawget獲取表的值時沒有去訪問元表的__index 方法,而是直接訪問了表w ,所以輸出了nil.

而第二次列印的時候沒有使用rawget方法獲取表的值 則呼叫的了元表的__index方法去獲取表的值輸出了元方法的返回值.

當直接對w.fgreen賦值時,使用了元方法__newindex,元方法裡面又使用了rawset 設定表的值,此時不會再去呼叫元方法__newindex了,所以設定成功了.

如果將rawset(t, key, value)換成t.fgreen = value的話將會造成死迴圈,因為t.fgreen = value的直接賦值會繼續去呼叫元方法__newindex,造成堆疊溢位.

lua函式之rawget和rawset

rawset rawget 對 原始的 表進行直接的賦值 取值操作。當操作table時,如果我們有以下需求 在將rawset和rawget之前,我們先來看看matetable。lua中每種型別的值都有都有他的預設操作方式,如,數字可以做加減乘除等操作,字串可以做連線操作,函式可以做呼叫操作,表可以做...

stdafx h和targetver h的作用

stdafx.h和targetver.h的作用 所謂標頭檔案預編譯 就是把乙個工程 project 中使用的一些mfc標準標頭檔案 如windows.h afxwin.h 預先編譯,以後該工程編譯時,不再編譯這部分標頭檔案,僅僅使用預編譯的結果。這樣可以加快編譯速度,節省時間。預編譯標頭檔案通過編譯...

stdafx h和targetver h的作用

stdafx.h和targetver.h的作用 所謂標頭檔案預編譯,就是把乙個工程 project 中使用的一些mfc標準標頭檔案 如windows.h afxwin.h 預先編譯,以後該工程編譯時,不再編譯這部分標頭檔案,僅僅使用預編譯的結果。這樣可以加快編譯速度,節省時間。預編譯標頭檔案通過編譯...