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

标签 lua

我最近试用了 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/

相关文章:

audio - 如何在Lua中发出声音警报?

ios - Corona SDK system.orientation 在 iPhone 上返回错误的值?

lua - 我可以将 `init.lua` 与 Hammerspoon 中的不同组件分开吗?

c++ - 为嵌入式 Lua 重定向/重新定义 print()

c - Lua C 模块 : confused about including members

Luabind 和协程

multithreading - 用lua制作一个线程系统

c++ - 如何在与LUA脚本一起使用的Lambda中引用 'this'

file - 使用lua获取文件创建时间

lua - 如何将不同的成本函数应用于卷积网络的不同输出 channel ?