Lua中的table.sort:不理解这段代码?
2013-10-3 13:52:3
收藏:0
阅读:125
评论:2
-- 原始表格
t = {
Steve = 20,
Mary = 32,
Tim = 15
}
-- 用于帮助排序t{}的第二个表格
a = {}
for n in pairs(t) do
a[#a + 1] = n -- 我不完全理解这行代码。我知道[#a + 1]是迭代器,但是a[#a + 1]等于“n”是为什么呢?
end
table.sort(a)
for _, n in ipairs(a) do -- 我不明白下划线的用途
print (n)
end
-- 执行table.sort函数的另一种方式
function pairsByKeys(t, f)
local b = {}
for x in pairs(t) do
b[#b + 1] = x
end
table.sort(b, f)
local i = 0
return function()
i = i + 1
return b[i], t[b[i]] -- 我也不太理解这行代码?
end
end
在代码注释中,我提出了我对于具体代码的几个问题:
- 我不太清楚为什么需要两个不同的表格。一个用于存储信息,另一个通过
ipairs方法排序。我理解pairs和ipairs的不同。 - 我不太清楚具体代码
a[#a + 1] = n的意思是什么? - 为什么对于具体代码
for _, n in ipairs(a)要使用下划线? - 我不太清楚代码
return b[i], t[b[i]]的意思。
麻烦大家帮我更好地理解table.sort函数,这些都是来自PiL直接的例子。非常感谢!
点赞
用户2593005
问题1
for n in pairs(t) do
a[#a + 1] = n
end
# 操作符返回表中元素的数量(实际上它只返回表中最高的数字索引,但在这个例子中没有关系)。在这个循环中,n 是从 pairs(t) 返回的第一个值(一对值中的第一个),即表中当前元素的键。因此,代码可以被看做是评估为:
a[1] = 'Steve'
a[2] = 'Mary'
a[3] = 'Tim'
问题2
for _, n in ipairs(a) do
这里的下划线是 Lua 惯例,表示不需要 ipairs 的索引值。它可以被看作是 Lua 能够从函数返回多个值的副作用。实际上,第一个值被存储在一个名为 _ 的变量中,但程序员故意不使用它。
2013-09-27 22:11:14
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
--用于排序t{}的第二个表 a = {} for n in pairs(t) do a[#a + 1] = n end[#a + 1]不是迭代器——它是访问表中特定元素的索引。#a是表的大小。通过将此大小加1,您正在访问表中的最后一个元素。此操作在循环中将n添加到a表的末尾。这与执行以下操作相同:
table.insert(a,n)for _, n in ipairs(a) do --我不理解下划线的意义 -- ...这里的下划线只是用来表示未使用的变量。
_是Lua中有效的变量,但在Lua中没有任何特殊含义。您可以将其命名为dummy,在这里没有任何区别。这里需要该虚拟变量,因为
pairs和ipairs返回键后跟随的值。此代码想要“跳过”键而只使用该值。-- ... return function () i = i + 1 return b[i], t[b[i]] --我也不理解这一行? end这是一个匿名闭包,当调用它时,它会返回2个值。
b[i]是表b中的下一个元素。t[b[i]]使用b[i]作为键来访问t中的一个值。更明确的步骤如下:
return function () i = i + 1 local nextkey = b[i] local nextvalue = t[nextkey] return nextkey, nextvalue end