3

我想引用一个整数,但引用应该在一个表内。目标是自动字符串格式化功能,每帧更新值。

>> num = 5
>> table = {}
>> table[1] = num
>> num = 10
>> print(table[1])
>> 5

如果我运行这个值 num 只会被复制,但我需要一个参考。我现在正在用 lua löve2D 库编写游戏。这是我的代码的摘录:

function StringDrawSystem:draw()
    for index, entity in pairs(self.targets) do
        local str = entity:getComponent("StringComponent")
        love.graphics.setFont(str.font)
        local position = entity:getComponent("PositionComponent")
        love.graphics.print(string.format(str.string, unpack(str.values)), position.x, position.y)
    end
end

str.values是一个应该包含对所需值的引用的表。这些价值观不一定是全球性的。

entity:getComponent("StringComponent") -- is equal to 
entity.components.StringComponent -- StringComponent is just 
                                  -- a component added to the entity 

StringComponent 是一个具有 3 个字段的简单类。

StringComponent = class("StringComponent")

function StringComponent:__init(font, string, values) 
    self.font = font
    self.string = string
    self.values = values
end
4

3 回答 3

2

您不能直接执行此操作,但您可以在需要字符串值时提供一个闭包来调用,如下所示:

x = 5
table = {}

table["key"] = function() return x end

print(table["key"]()) -- Will print 5
x = 10
print(table["key"]()) -- Will print 10
于 2013-09-15T22:20:23.337 回答
2

如果没有更多级别的重定向,您将无法做到这一点,因为您无法引用数值。您可以将所需的值存储在表中并修改该表中的第一个元素:

num = {}
num[1] = 5
table = {}
table[1] = num
num[1] = 10
print(table[1][1])
-- 10
于 2013-09-16T01:39:51.250 回答
0

我找到了解决我当前问题的方法。我想引用的每个 int 在某种程度上都是另一个表的孩子。因此,例如,如果您想在 StringComponent 的构造函数中引用table.inttable2.int2i 传递{{table, "int"}, {table2, "int2"}}给。values现在您可以使用更新的值创建一个表

local val = {}
for k, v in pairs(str.values) do
    table.insert(val, v[1][v[2]])
end

现在我可以用

string.format(str.string, unpack(val))

如果您有更好的解决方案,请随时发布,以便我优化我的代码。

于 2013-09-17T13:10:46.193 回答