为什么在Lua中通过函数改变变量的值会改变其父表中该变量的值?

Assertion = {
    key
}

print(Assertion.key)

function Assertion:brl(ky)
    self.key = ky
end

v = Assertion
v:brl(5)

print(Assertion.key)
print(v.key)

输出结果

nil
5
5

所以我的问题是,即使我只改变了'v.key',为什么'Assertion.key'也会改变呢?

点赞
用户2858170
用户2858170
v = Assertion

在这一行之后,v 引用的是 AssertionAssertion = {} 将创建一个新的表并将该表的引用存储在变量 Assertion 中。 Assertion 不包含该表。 v = Assertion 只是创建对该表的第二个引用。它不会复制表或其任何内容。

因此,v:brl(5) 等同于 Assertion:brl(5)v.keyAssertion.v 是完全相同的值。

根据 Lua 5.4 参考手册 2.1 值和类型

表、函数、线程和(full)userdata 值是对象:变量实际上并不包含这些值,只包含对它们的引用。赋值、参数传递和函数返回始终操作对这些值的引用;这些操作不意味着任何类型的复制。

如果您想要实际复制表值,请阅读此文章:

如何通过值复制 Lua 表?

如果您对面向对象编程感兴趣,请阅读以下内容:

https://www.lua.org/pil/16.html

http://lua-users.org/wiki/ObjectOrientedProgramming

如果您想让多个对象共享同一个函数,请参阅文章。

2021-02-27 10:42:26