在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 預先編譯,以後該工程編譯時,不再編譯這部分標頭檔案,僅僅使用預編譯的結果。這樣可以加快編譯速度,節省時間。預編譯標頭檔案通過編譯...