Lua有类似于Scala的map或C#的Select功能的等效函数吗?
2012-7-26 13:3:26
收藏:0
阅读:135
评论:5
我正在寻找一种好的方法来对 Lua 表格进行映射 / 选择。
例如,我有一个表格:
myTable = {
pig = farmyard.pig,
cow = farmyard.bigCow,
sheep = farmyard.whiteSheep,
}
我该如何编写 myTable.map(function(f) f.getName)?[假设所有的农场动物都有名字]
即应用该函数到表格中的所有元素。
点赞
用户1208078
function map(tbl, f)
local t = {}
for k,v in pairs(tbl) do
t[k] = f(v)
end
return t
end
t = { pig = "pig", cow = "big cow", sheep = "white sheep" }
local newt = map(t, function(item) return string.upper(item) end)
table.foreach(t, print)
table.foreach(newt, print)
输出结果为:
pig pig
sheep white sheep
cow big cow
pig PIG
cow BIG COW
sheep WHITE SHEEP
2012-07-26 14:41:59
用户2349885
一种使用元表的优雅解决方案:
map = function (old_t, f)
return setmetatable({}, {
__index = function (new_t, k)
new_t[k] = f(old_t[k])
return new_t[k]
end
})
end
结果表仅在需要时才计算每个条目,本质上是一个惰性表。
这意味着它也可以在无限惰性列表和表上工作,但有一个警告 - 即如果 f 对于相同的输入不总是返回相同的结果,那么由于函数调用被延迟,所以当创建表时和每个键第一次索引时,结果表的行为可能会有所不同,这需要注意。
2018-05-01 22:14:25
用户11111710
以下是 Lua 中的 map 函数示例 -
function(f, t)
local o = {}
for i = 1, #t do
o[#o + 1] = f(t[i])
end
return o
end
请注意:上述实现未经优化。它应该可以满足您的要求。但是,如果您想要 Lua 中最快的 map() 函数之一的实现,可以查看此网址 - Lua Map Function 其中包含代码和说明。
2019-02-25 04:43:08
用户6551181
好吧,所有其他答案都提供了一个缓慢的 map 函数。当您在表中有超过几个元素时,您将能够看到性能差异。
这是最快的纯 Lua map() 函数 -
function map(f, t)
local t1 = {}
local t_len = #t
for i = 1, t_len do
t1[i] = f(t[i])
end
return t1
end
它不使用循环中的 # 运算符进行比较,也不执行 t1[#t1+1],这两个都很慢。
PS:这段代码来自于这篇文章。
2019-07-18 12:48:19
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
如果您正在使用 Lua 5.1,那么可以使用
table.foreach():a = { 1, 2, 3 } table.foreach(a, function(k,v) a[k] = v + 2 end) table.foreach(a, print) -- 1 3 -- 2 4 -- 3 5然而,这种方法已经被弃用,在 5.2 中已不再支持。