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

点赞
stackoverflow用户841108
stackoverflow用户841108

Lua 表(通常用作对象)不会被复制,而是被引用。(在内部,使用指针引用它们)

2011-12-08 12:29:16
stackoverflow用户221509
stackoverflow用户221509

但是值将被存储为字符串,因此需要在两个地方引用字符串,而不是表。

首先,所有类型(布尔,数字和轻用户数据除外)都是引用 - 如果t是一个表格并且您执行t2 = t,那么tt2都是对内存中同一个表格的引用。

第二件事 - 在Lua中,字符串被编译。这意味着所有相等的字符串,如"abc""ab" .. "c"的结果实际上是单个字符串。Lua也仅存储对字符串的引用。因此,您不必担心内存 - 每次只有一个字符串实例。

您可以安全地执行parent.child.value = parent.child[1].value,您只会在表中使用一个槽的内存(几个字节),不会复制字符串,只有引用。

2011-12-08 13:07:33
stackoverflow用户513763
stackoverflow用户513763

这是一种使用元表的好应用:

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可能也很有趣。

2011-12-08 13:19:24
stackoverflow用户3184714
stackoverflow用户3184714

使用C数组时,由于指针算术运算,parent.childparent.child[0]是等价的。你真的不应该试图模拟C中最容易出错、令人困惑和冗余的特性之一,只因为你喜欢这种风格。

2014-01-11 09:53:47