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