表之间的值没有变化

问题描述 投票:0回答:1

这是计时器的代码:

local copyTable = require("Helpers.copyTable")

local timer = {}

timer.max = 0
timer.time = 0

function timer:add(dt)
    timer.time = timer.time + dt
end

function timer:reset()
    timer.time = 0
end

return copyTable(timer)

复制表函数返回一个新表,其中包含复制表的所有值。

这是使用它的一些基本代码:

ovenTime = require("timer")

ovenTime.add(.5)

print(ovenTime.time)

这给了我 0 的输出。 我原以为它会输出 0.5,因为时间被添加到了 0.5 上。

提前致谢!

lua lua-table
1个回答
0
投票

最重要的是,如果你用分号声明方法

add()
,那么你应该调用它:
ovenTime:add (.5)
,而不是
ovenTime.add (.5)

还有其他小改进:

timer.lua

local copyTable = require 'Helpers.copyTable'

local timer = { max = 0, time = 0 }

function timer:add (dt)
    self.time = self.time + dt
end

function timer:reset ()
    self.time = 0
end

-- serialisable "decorator":
local function serialisable (tbl)
    local meta = getmetatable (tbl) or {}
    meta.__tostring = function (tbl)
        return tostring (tbl.time)
    end
    return setmetatable (tbl, meta)
end

return serialisable (copyTable (timer))

以及调用程序:

ovenTime = require 'timer'

ovenTime:add (.5) -- note ':' instead of '.'.

print (ovenTime) -- it will output '0.5', not 'table: 0x...'

还有一些

timer.lua
的进一步简化:

-- serialisable 'decorator':
local function serialisable (tbl)
    local meta = getmetatable (tbl) or {}
    meta.__tostring = function (tbl)
        return tostring (tbl.time)
    end
    return setmetatable (tbl, meta)
end

return serialisable {
    time = 0,
    max = 0,
    add = function (self, dt)
        self.time = self.time + dt
    end,
    reset = function (self)
        self.time = 0
    end
}

最后,一个允许多个独立计时器的解决方案,因为这似乎就是你想要的,因为你深度复制了表:

timer.lua

-- serialisable 'decorator':
local function serialisable (tbl)
    local meta = getmetatable (tbl) or {}
    meta.__tostring = function (tbl)
        return tostring (tbl.time)
    end
    return setmetatable (tbl, meta)
end

return function ()
    return serialisable {
        time = 0,
        max = 0,
        add = function (self, dt)
            self.time = self.time + dt
        end,
        reset = function (self)
            self.time = 0
        end
    }
end

及其调用者:

local timer = require 'timer'
local ovenTime = timer ()
ovenTime:add (.5)
print (ovenTime)
© www.soinside.com 2019 - 2024. All rights reserved.