#unity/日常积累
在Lua中,rawset是一个函数,用于直接设置__newindex元rawset。
rawset(table, key, value)
table:key:要设置键。value:返回值是table本身。
__newindex元方法当表设置了元表并定义了__newindex,普通的赋值操作就会触发__newindex。使用rawset可以直接修改表内容而不是触发元方法。
示例:
local t = {}
local mt = {
__newindex = function(table, key, value)
print("Intercepted assignment:", key, value)
end
}
setmetatable(t, mt)
t.a = 10 -- 会触发 __newindex,打印信息
rawset(t, "a", 20) -- 直接设置,不触发 __newindex
print(t.a) -- 输出:20
在需要频繁操作表且无需触发元方法时,rawset 可以避免额外的调用开销。
必须确保 table 是一个有效的表: 如果传入的不是表,会抛出错误。
rawset(nil, "key", "value") -- 报错:attempt to index a nil value
键必须是有效的 Lua 键: 键可以是任意非 nil 的值,但要确保其符合 Lua 的键要求。
慎用 rawset: 因为它直接修改表,绕过了元表机制,可能导致逻辑不一致。在需要控制表行为的场景(例如保护表的访问)时,应尽量避免使用。
rawset 和 rawget,建议搭配特定的表设计结构,例如只在调试模式下操作底层表。