Lua 中有像指针一样的东西吗?
我是Lua的新手,我想创建一个像[doh]这样存储值的表:
parent.child[1].value = "whaterver"
parent.child[2].value = "blah"
然而,大多数情况下只有一个子元素,所以访问值会更容易:
parent.child.value
为了简化事情,我想以某种方式存储我的值,使得
parent.child[1].value == parent.child.value
但是,为了做到这一点,我需要在内存中存储这个值两次。有没有办法让它指向同一内存地址:
parent.child.value points to parent.child[1].value
而无需在内存中存储两次该价值?
另一个问题是,如何检查一个表占用多少内存?
原文链接 https://stackoverflow.com/questions/8430976
但是值将被存储为字符串,因此需要在两个地方引用字符串,而不是表。
首先,所有类型(布尔,数字和轻用户数据除外)都是引用 - 如果t
是一个表格并且您执行t2 = t
,那么t
和t2
都是对内存中同一个表格的引用。
第二件事 - 在Lua中,字符串被编译。这意味着所有相等的字符串,如"abc"
和"ab" .. "c"
的结果实际上是单个字符串。Lua也仅存储对字符串的引用。因此,您不必担心内存 - 每次只有一个字符串实例。
您可以安全地执行parent.child.value = parent.child[1].value
,您只会在表中使用一个槽的内存(几个字节),不会复制字符串,只有引用。
这是一种使用元表的好应用:
parent={
child={
{value="whatever"},
{value="blah"}
}
}
setmetatable(parent.child,{__index=parent.child[1]})
如果在子表中找不到索引(比如“ value”),则会在元表的__index值表中查找(在这种情况下是child中的第一个元素)。
现在我们可以看到上面的代码存在一个问题:
print(parent.child.value) -- 输出whatever
parent.child[1]=nil --删除第一行
print(parent.child.value) -- 仍然输出whatever!
这是因为元表保留了第一个子表的引用,防止它被销毁。此类问题的解决方法是A)使元表成为弱表,或B)将__index字段成为一个函数,而不是将其引用到一个表中。
--A)
setmetatable(parent.child, setmetatable(
{__index=parent.child[1]} --子表的元表
{__mode='v'}--元表的元表,使其具有弱密钥
)
)
parent.child[1]=nil
print(parent.child.value) --返回nil
parent.child[1]={value='foo'}
print(parent.child.value) --输出nil,元表引用到一个不存在的表。
--因此解决方案B)
setmetatable(parent.child, {__index=function(t,k) return parent.child[1][k]})
print(parent.child.value) -- 'whatever'
parent.child[1]=nil
print(parent.child.value) -- nil
parent.child[1]={value='foobar'
print(parent.child.value) -- foobar,现在它将始终引用child [1]中的表,即使它发生了变化。
如果你真的对元表很感兴趣,可以尝试阅读Programming in Lua,第13章和第17章(弱表)。Lua-Users wiki on MetaMethods可能也很有趣。
使用C数组时,由于指针算术运算,parent.child
和parent.child[0]
是等价的。你真的不应该试图模拟C中最容易出错、令人困惑和冗余的特性之一,只因为你喜欢这种风格。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
Lua 表(通常用作对象)不会被复制,而是被引用。(在内部,使用指针引用它们)