这是你的情况吗?
local shapes = { }
local function callback(shape_one)
-- ???
end
local the_shape = { is_circle = false }
shapes[4] = the_shape
assert(callback(the_shape) == 4)
shapes[4] 和 the_shape 都包含对值的引用,但在 Lua 中这两个变量之间没有其他联系。因此,您不能说“表中变量的索引”,而应该说“表中值的索引,匹配变量中的值”。 "matches" 究竟是什么取决于您的情况。在这种情况下,您很可能在寻找参考平等。
注意,在 Lua 中所有的表值都是唯一的,所以the_shape ~= { is_circle = false }(即具有相同内容的新表),但the_shape == shapes[4](都引用相同的值)。如果需要,您可以按值比较表格,但这是一个单独的主题。
所以,如果你真的想在表中找到值的索引,你必须手动搜索它。要么进行线性搜索:
local function callback(shape_one)
for k, v in pairs(shapes) do
if v == shape_one then
return k
end
end
return nil, "shape not found" -- or maybe call error() here
end
...或缓存所有形状:
local function tflip(t)
local r = { }
for k, v in pairs(t) do
r[v] = k -- overrides duplicate values if any
end
return r
end
local shape_index = tflip(shapes)
local function callback(shape_one)
return shape_index[shape_one] -- will return nil if not found
end
请注意,shape_index 当然会阻止对其内容进行垃圾收集。假设它的生命周期与shapes 表的生命周期相同并且与它保持同步,这不是问题。如果这不是您的情况,您可以将shapes 表配置为弱键。 (如果您希望我扩展这一点,请告诉我。)
顺便说一句,您可以使用一些可转换的魔法使 shape_index 自动保持最新。如果您也想对此进行解释,请告诉我,我会更新答案。