在Lua中将数组作为函数参数传递?
我试图修改我在这个视频中找到的类示例,使其更加简洁易用。希望我的注释足够清楚地解释了我想要实现的目标。我遇到的问题是,当我尝试使用数据表时,它会给我这个错误:lua: class example.lua:7: attempt to index field 'data' (a nil value)
我假设这意味着数组没有被正确地传递到函数中,但我不知道为什么。我在Lua方面非常初学者。
下面是我写的代码:
local enemy = {}; --enemy class table
function enemy:New(data)
local object = {}; --table to store all of data within class
local len = # data --get length of passed table
for i = 1, len, 2 do --loop to input all data from passed table into object table
object.data[i] = data[i + 1];
end
function object:getData(choice) --function that allows us to retrieve data from the class
return self[choice];
end
return object; --return class data table so we can create objects using the class
end
local monsterdata = {"name", "monster", "x", 64, "y", 128, "hp", 4}; --table containing data of monster. keys are odd numbered, values to those keys are even numbered
local monster = enemy:New(monsterdata); --create a object using the class
local test = monster:getData("x"); --set variable to a value with the getData function
print(test);
如果你想让 object 存储数据,你可能想要写成:
object[data[i]] = data[i + 1];
而不是
object.data[i] = data[i + 1];
这样做会输出 64。
像其他人说的,object.data需要初始化,并且for循环和getData中存在缺陷。另外,虽然这不是一个bug,但是你传递奇数作为键和偶数作为值的系统在基于C的语言中是一个很好的方法,没有关联数组/字典/表面值,但在Lua中,惯用法是
{ keyname = value,keyname = value,...}
如果表涵盖多行,则可以如下使用:
` { keyname = value; keyname = value; keyname = value; ... } `
所以在你的情况下,monsterdata只需要是
` { name = "monster"; x = 64; y = 128; hp = 4; } `
你可以完全去掉for循环。
注意:你只能用这种方式表示字符串键。对于其他类型的键,如数字,布尔值或甚至函数和其他表格,将键括在[方括号]中。例如,如果你想要一个mynot表格,将布尔值映射到它们的相反值,你可以使用:
` { [true] = false; [false] = true; } `
或者,如果您想将一组函数映射到它们的库中,则可以这样使用:
` { [print] = "standard"; [os.execute] = "standard os"; [math.sin] = "standard math"; [function() print "a user function" end] = "me!"; } `
我认为你越了解Lua,你会越喜欢它。这真的是一种很棒的语言,有很多有趣的小功能。祝你编码愉快!
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
你没有创建
object.data表 - - Lua 中每个表都需要初始化:local object = {} local object.data = {}或者
local object = { data = {} }然而,除非你修复
getData函数,否则你的示例不会按预期工作:function object:getData(choice) return self.data[choice] end最后,这是 Lua,所以你的代码中不需要任何
;:P。