1.6 KiB
1.6 KiB
#unity/日常积累
在Lua中,rawset
是一个函数,用于直接设置__newindex
元rawset
。
rawset(table, key, value)
table
:key
:要设置键。value
:
返回值是table
本身。
使用场景
1.跳过__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
2. 性能优化
在需要频繁操作表且无需触发元方法时,rawset
可以避免额外的调用开销。
注意事项
- 必须确保
table
是一个有效的表: 如果传入的不是表,会抛出错误。
rawset(nil, "key", "value") -- 报错:attempt to index a nil value
-
键必须是有效的 Lua 键: 键可以是任意非
nil
的值,但要确保其符合 Lua 的键要求。 -
慎用
rawset
: 因为它直接修改表,绕过了元表机制,可能导致逻辑不一致。在需要控制表行为的场景(例如保护表的访问)时,应尽量避免使用。
常见问题
- 如果需要更安全地使用
rawset
和rawget
,建议搭配特定的表设计结构,例如只在调试模式下操作底层表。