返回Lua表格的索引位置
2012-3-21 6:11:1
收藏:0
阅读:96
评论:3
我已经问了几个人并在 Google 上搜索过,但没有找到 Lua 中返回变量在表中索引的方法。我有一个回调函数,返回的变量将始终是表的一部分。在回调函数中它只是称为 "shape_one",但形状本身将是形状表中的一个,并且会像这样:Objects.shapes[4]。
如果 "shape_one" 的值为 Objects.shapes[4],那么是否有办法返回 4?
我希望我足够清楚。
原文链接 https://stackoverflow.com/questions/9798294
点赞
stackoverflow用户837856
最高效的方法是使用 shape_one 作为键:
local shapes = { }
local function callback(shape)
-- 如果您想从表中删除 shape_one:
shapes[shape] = nil
-- 或者如果您想验证它是否存在:
print(shapes[shape] ~= nil)
end
local the_shape = { is_circle = false }
shapes[the_shape] = true
callback(the_shape)
for shape, _ in pairs(shapes) do
callback(shape)
end
Lua使用哈希来确保每个表都是唯一的键,它使用的算法非常快速(不像Alexander Gladysh的解决方案那样迭代表)。
2012-03-21 09:06:36
stackoverflow用户319344
我知道它被用于其他用途,但它也适用于这种情况。
shapes = {} -- 创建您的表,可以随意命名
shapes.r_index = {} -- 保存数值,即 t[1] = 'Foo'
shapes.r_table = {} -- 保存字符串值,即 t['Foo'] = 1
mt = {} -- 创建元表
mt.__newindex = function (self, key, value) -- 用于创建新索引
if value == nil then -- 如果您要删除一个条目,则执行以下操作
if tonumber(key) then -- 检查您是否正在提供数字索引
local i_value = self.r_index[key] -- 获取相应的字符串索引
self.r_index[key] = nil -- 删除
self.r_table[i_value] = nil
else -- 否则执行与上述相同的操作,但为给定的字符串索引
local t_value = self.r_table[key]
self.r_index[t_value] = nil
self.r_table[key] = nil
end
else
table.insert(self.r_index, tonumber(key), value) -- 对于 t[1] = 'Foo'
self.r_table[value] = key -- 对于 t['Foo'] = 1
end
end
mt.__index = function (self, key) -- 当您对它们进行索引时,让您返回值
if tonumber(key) then
return (self.r_index[key]) -- 对于 t[1] = 'Foo'
else
return (self.r_table[key]) -- 对于 t['Foo'] = 1
end
end
setmetatable(shapes, mt) -- 创建元表
shapes[1] = "Circle" -- 设置值
shapes[2] = "Square"
print(shapes[1], shapes[2]) -- 应该可以证明它有效
print(shapes['Circle'], shapes['Square'])
shapes[1] = nil
print(shapes[1], shapes[2]) -- 应该可以证明它有效
print(shapes['Circle'], shapes['Square'])
使用此方法,您应该可以访问和修改值。它使用数字索引,因此如果这不是您想要的内容,则可能需要更改这一部分。这将允许您创建新键并使用一个变量获取值;但它可能不是最有效的实施方式。
2012-03-21 09:32:38
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
这是你的问题吗?
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 中,这两个变量之间没有其他的连接。因此,你不能说“一个变量在表中的索引”,而应该说“一个表中值的索引,配对上了一个变量中的值”。什么样的内容算是“配对上了”,取决于你的情况。在本例中,你最可能在寻找引用相等。请注意,在 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" end
...或者缓存所有的形状:
local function tflip(t) local r = {} for k, v in pairs(t) do r[v] = k --如果有重复值,则覆盖 end return r end local shape_index = tflip(shapes) local function callback(shape_one) return shape_index[shape_one] --如果没有找到,则返回 nil end
请注意,
shape_index
,当然,会防止其内容被垃圾回收。假设它的生命周期与shapes
表相同,并且与之保持同步,那么这不是一个问题。如果不是这种情况,请将shapes
表配置为弱键。 (如果需要,可以告诉我扩展这个问题。)顺便说一下,你可以借助一些元表技巧自动更新
shape_index
。如果你想了解更多信息,请告诉我,我会更新答案。