gpt4 book ai didi

lua - 在两个表中调用函数给出相同的输出

转载 作者:行者123 更新时间:2023-12-04 03:47:36 24 4
gpt4 key购买 nike

我最近试用了 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,这正是我想要的。那我做错了什么?

(抱歉,如果我写错了地方,这是我在这里的第一篇文章:))

如有任何帮助,我们将不胜感激。

问候

最佳答案

表不是不可变的,也就是说,它们总是通过引用传递。

Table1Table2 都引用表 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com