调用两个表中的函数会得到相同的输出

我最近尝试了Lua的Pseudo OOP机制。我想在两个表中调用一个函数,该函数将一个值写入它们各自的表中。我尝试使用self变量。这是我的代码:

local Table = {}
Table.value = 0;

function Table:myfunc(Parameter)
    self.value = Parameter;
end

local Table1 = Table;
local Table2 = Table;

Table1:myfunc("1");
Table2:myfunc("2");

print(Table1.value)
print(Table2.value)

问题是,它两次都打印2。如果我在函数内打印参数,那么它显示的是1和2,正是我想要的。 那我做错了什么呢?

(如果我在错误的地方写这篇文章,对不起,这是我第一次发帖:))

任何帮助都将不胜感激。

问候

点赞
用户8621712
用户8621712

表并非不可变的,这意味着它们总是按引用传递。

Table1Table2 都引用了表 Table

此代码所做的与以下代码相同:

Table:myfunc("1")
Table:myfunc("2")

为了解决这个问题,您需要将每个表作为单独的实例。要在它们上使用 myfunc,您需要将此函数复制到每个实例中,或者创建一个元表以所有实例,然后将 myfunc 放在其中。

解决方案1:

local Table1 = {value = 0, myfunc = myfunc} --每个实例都必须设置此函数
local Table2 = {value = 0, myfunc = myfunc}

Table1:myfunc("1")
Table2:myfunc("2")

print(Table1.value, Table2.value) -- 1    2

解决方案2:

local Meta = {myfunc = myfunc} -- 创建元表
Meta.__index == Meta -- 在索引事件(在 tbl.var 或 tbl[var] 上)使用 "Meta" 表

local Table1 = {value = 0}
local Table2 = {value = 0}
setmetatable(Table1, Meta) -- 为实例设置元表
setmetatable(Table2, Meta)

Table1:myfunc("1")
Table2:myfunc("2")

print(Table1.value, Table2.value) -- 1    2

当您索引不存在的键时,元表的 __index 将被使用,就像是后备处理的情况。

该问题在 Lua PIL book 中得到了解释和元表的未来解释: https://www.lua.org/pil/16.html

2020-11-19 14:00:43