如何在lua中创建一个没有迭代的数组
2016-3-25 5:47:22
收藏:0
阅读:62
评论:2
我需要创建一个长度由一个变量指定的零表。在python中,我可以写成:
arr = [0] * size
但在lua中,我只能像这样做:
local arr = {} for i=1,size do arr[i] = 0 end
是否有任何我可以用python样式在lua中做到这一点的方法?非常感谢大家。
点赞
用户3677376
虽然我不建议这样做,但是你可以在 Lua 中接近 Python 的语法:
local A = require"A" -- 请参见下面 module "A" 的代码实现
-- ...
local t = A[0] * 10
for i,v in ipairs( t ) do
print( i, v )
end
这是 module "A" 的代码:
local M_meta = {}
local M = setmetatable( {}, M_meta )
local function forbid_operation() -- 防止错误操作
error( "not a regular table, operation forbidden!" )
end
local O_meta = {
__index = forbid_operation,
__newindex = forbid_operation,
__pairs = forbid_operation,
__ipairs = forbid_operation,
__mul = function( self, n )
if type( self ) == "number" then
self, n = n, self -- 在例如 `3 * A[0]` 中交换值
end
local t, v = {}, self[ M_meta ]
for i = 1, n do
t[ i ] = v
end
return t
end,
__metatable = false,
}
local function index_or_call( self, v )
-- 使用 M_table 作为私有键:只有此模块可以访问它,因为它是局部的
return setmetatable( { [ M_meta ] = v }, O_meta )
end
M_meta.__index = index_or_call -- A[0] 语法
M_meta.__call = index_or_call -- 允许使用 A(0) 语法
M_meta.__newindex = forbid_operation
M_meta.__pairs = forbid_operation
M_meta.__ipairs = forbid_operation
M_meta.__metatable = false
return M
该模块实际上返回一个带有自定义 __index(和 __call)元方法的表。当调用 __index 或 __call 时,将返回另一个表,其中给定的值存储在一个私有字段中,并带有这次的 __mul 元方法。__mul 元方法从私有字段中检索值,并使用给定值创建请求长度的数组,然后将其返回。
2016-03-26 10:38:32
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
似乎没有使用该语言语法构建此计划的方法。相反,考虑创建一个生成
size数组的函数。然后,您可以简单地说arr = newArray (5)或类似语法。function newArray (size) local arr = {} for i=1, size do arr[i] = 0 end return arr end您可以扩展此功能以创建初始化为任何值的数组:
function newArray (size, value) value = value or 0 local arr = {} for i=1, size do arr[i] = value end return arr end编辑:上述示例并不意味着完美的解决方案,我强烈反对在不了解其限制的情况下复制代码。确实,如果您需要允许布尔值,请更改函数以适应您的需求。将值作为可选参数的建议是方便举例。建议代码允许false是一个好建议,但该答案展示了一种选项而不是详尽的解决方案。