【问题标题】:Using a coordinate pair as a key in a Lua table使用坐标对作为 Lua 表中的键
【发布时间】:2015-03-14 14:51:30
【问题描述】:

正如标题所说,我正在尝试使用坐标对 (x, y) 作为表格的键。这是我到目前为止所做的事情

local test = {_props = {}}
local mt = {}
local xMax = 5
local yMax = 5

local function coord2index(x, y)
    return ((x-1) * xMax) + y
end

mt.__index = function(s, k)
    if s._props[coord2index(k[1], k[2])] ~= nil then
        return s._props[coord2index(k[1], k[2])]
    end
end

mt.__newindex = function(s, k, v)
   s._props[coord2index(k[1], k[2])] = v 
end
mt.__call = function (t, k)
    if type(k) == "table" then print "Table" end
end

setmetatable(test, mt)

test[{1,2}] = 5
print( test[{1,2}])

这实际上按预期工作。我真的想知道是否有办法进一步减少这种情况,例如test[1,2] = 5print(test[1,1])。这没有技术上的需要,纯粹是为了我对 Lua 的进一步熏陶。

【问题讨论】:

    标签: lua lua-table


    【解决方案1】:

    我认为你的方法很好。您还可以使用字符串而不是数字,并在您的 coord2index 函数中执行类似 return x..';'..y 的操作。

    【讨论】:

    • 也许我误解了你的意思,但这不就是把括号换成引号吗?如果我明白你的建议是什么意思,我会做类似test["1,2"] = 5print(test["1,2"]) 的事情?还是我太密集而遗漏了什么?
    • 是的,但在您的情况下,1 和 2 是变量。当然,您(作为用户)可以写test[a..';'..b],但这会将实现细节暴露给用户。在您的实现中,您隐藏了这些细节,这就是我建议使用相同机制的原因,只是密钥的格式不同。
    • 对于 Lua 5.3 整数,这段代码可能会导致奇怪的结果 :)
    • x..';'..y 此代码取决于数字类型(整数/浮点数),并且不容易跟踪此类型。例如旧的 C 代码可以使用 lua_pushnumber 将坐标传递给 Lua 和其他部分使用,例如数字字面量。我认为如果坐标是整数代码应该使用 floor/ceil/round 或使用 string.format("%g;%g",...) 来确保数字是整数。
    • @PaulKulchenko 这是一种有趣的方法,我想知道它与我的(使用表格)相比如何使用。当我有机会时,我将不得不做一些测试。我觉得字符串更容易来回传递,以及动态生成。
    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 2020-12-23
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2016-12-24
    • 2017-09-20
    • 2016-03-08
    相关资源
    最近更新 更多