2025-03-26 00:02:56 +08:00

1.6 KiB
Raw Permalink Blame History

#unity/日常积累

在Lua中rawset是一个函数,用于直接设置__newindexrawset

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 可以避免额外的调用开销。

注意事项

  1. 必须确保 table 是一个有效的表: 如果传入的不是表,会抛出错误。
rawset(nil, "key", "value")  -- 报错attempt to index a nil value
  1. 键必须是有效的 Lua 键: 键可以是任意非 nil 的值,但要确保其符合 Lua 的键要求。

  2. 慎用 rawset 因为它直接修改表,绕过了元表机制,可能导致逻辑不一致。在需要控制表行为的场景(例如保护表的访问)时,应尽量避免使用。


常见问题

  • 如果需要更安全地使用 rawsetrawget,建议搭配特定的表设计结构,例如只在调试模式下操作底层表。