在 for 循环中声明一个局部变量可以吗?
2017-4-8 21:6:59
收藏:0
阅读:104
评论:2
for x = 1, 16 do
for y = 1, 16 do
local cntr = Center:new()
cntr.point = {x = 0.5 + x - 1, y = 0.5 + y - 1}
centerLookup[cntr.point] = cntr
table.insert(self.centers, cntr)
end
end
上面的代码中,centerLookup[point] 用来查找相应的 Center 对象,输入点位置即可。
然而当我尝试这样做时:
function neighbors(center, sqrtsize)
if center.point.y + 1 < sqrtsize then
local up = {x = center.point.x, y = center.point.y+1}
local centerup = centerLookup[up]
table.insert(center.neighbors, centerup)
end
end
centerup 返回 nil。
我不知道问题是否在于无法使用一个表作为索引,但我认为可能是这个问题。
有人知道这里的问题在哪吗?
顺便说一句,如果有帮助,centers 从 0.5 开始(例如 [0.5, 0.5] 就是第一个 center,然后是 [0.5, 1.5],等等)。
提前感谢!
点赞
用户5331361
Colonel Thirty Two 解释了代码不能按预期工作的原因。我想要添加快速解决方案:
function pointToKey(point)
return point.x .. "_" .. point.y
end
在两个地方都使用这个函数进行查找:
--设定中心查找
centerLookup[pointToKey(cntr.point)] = cntr
--从查找中找到点
local centerup = centerLookup[pointToKey(up)]
2017-04-08 21:04:09
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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 代码?

这与局部变量无关,而与表是按引用而不是按值比较有关。
在 Lua 中,表是具有自己标识的引用类型。即使两个表具有相同的内容,Lua 也不认为它们相等,除非它们是完全相同的对象。
这里有一些示例代码和打印出的值来说明这一点:
local tbl1 = {x = 0.5, y = 0.5} local tbl2 = tbl1 local tbl3 = {x = 0.5, y = 0.5} print(tbl1 == tbl2) -- True; tbl1 和 tbl2 引用同一张表 print(tbl1 == tbl3) -- False; tbl1 和 tbl3 引用不同的表local up = {x = center.point.x, y = center.point.y+1} local centerup = centerLookup[up]在这个片段中,
up是一个 全新的 表,只有一个引用(up变量本身)。即使存在与其具有相同内容的表键,这个新表也不会成为centerLookup表中的一个键。cntr.point = {x = 0.5 + x - 1, y = 0.5 + y - 1} centerLookup[cntr.point] = cntr table.insert(self.centers, cntr)在这个片段中,您创建了一个新表,并在三个不同的地方引用它:
cntr.point、centerLookup作为键,以及self.centers作为值。您可能会遍历self.centers数组,并使用 完全相同的表 在centerLookup表中查找项目。但是,如果您使用的是不在self.centers数组中的表,它将不起作用。