我最近试用了 luas Pseudeo OOP Mechanics。我想在表中调用一个函数,将值写入表中的变量。我尝试使用 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,这正是我想要的。 那我做错了什么?
(抱歉,如果我写错了地方,这是我在这里的第一篇文章:))
如有任何帮助,我们将不胜感激。
问候
最佳答案
表不是不可变的,也就是说,它们总是通过引用传递。
Table1
和 Table2
都引用表 Table
。
此代码的作用与:
Table:myfunc("1")
Table:myfunc("2")
要解决这个问题,您需要将每个表作为单独的实例。要在它们上使用 myfunc
,您需要将此函数复制到每个实例或为所有实例创建一个元表并将 myfunc
放入其中。
解决方案一:
local Table1 = {value = 0, myfunc = myfunc} -- every instance has to set this function
local Table2 = {value = 0, myfunc = myfunc}
Table1:myfunc("1")
Table2:myfunc("2")
print(Table1.value, Table2.value) -- 1 2
方案二:
local Meta = {myfunc = myfunc} -- create metatable
Meta.__index == Meta -- On indexing event (on tbl.var or tbl[var]) use "Meta" table
local Table1 = {value = 0}
local Table2 = {value = 0}
setmetatable(Table1, Meta) -- set metatable for the instance
setmetatable(Table2, Meta)
Table1:myfunc("1")
Table2:myfunc("2")
print(Table1.value, Table2.value) -- 1 2
Metatable 的 __index 用于使用不存在的键索引表,如后备。
这个问题在 Lua PIL 书中有解释, future 会解释元表:https://www.lua.org/pil/16.html
关于lua - 在两个表中调用函数给出相同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64913039/