lua函式之rawget和rawset

2021-08-14 03:08:51 字數 2370 閱讀 7564

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的變數分三種型別 全域性變數 區域性變數和...