在Lua中访问对象键的一些见解
2013-5-8 20:4:6
收藏:0
阅读:108
评论:1
我只是有点好奇,也有点困惑。在我的lua代码中,我从一开始就设置了一个新的对象。
因此,在实例化新的Enemy对象时,我调用上面的new函数。现在,在同一个文件中,Enemy对象的一个函数例如允许我访问“self.bullet”,当Enemy创建时创建的Bullet对象。它还允许我调用此Bullet瞬时中的trajectBullet函数。
我的问题来自于类似以下调用的内容。如果我尝试设置Bullet的属性,在这种情况下是所有者属性,我会得到一个nil错误,并且不会让我更改它。如果有人能帮我理解如何访问键和属性的方式,那将对我有很大帮助。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
你应该将你的类设置成这样
Bullet
Bullet = {} Bullet_mt = { __index = Bullet } function Bullet:new(co_ordinates) local obj = {x=co_ordinates[1],y=co_ordinates[2]} obj.owner = "You" --etc... return setmetatable(obj,Bullet_mt) endEnemy
Enemy = {slogan="Gettm!'"} Enemy_mt = {__index = Enemy;} function Enemy:new(args) local obj = {} --etc.. obj.bullet = Bullet:new({0,0}) return setmetatable(obj,Enemy_mt) --alert return setmetatable(obj,getmetatable(self)) end function Enemy:getBulletOwner() return self.bullet.owner; end你不应该每次敌人射击时都需要 "Bullet"。当你想为一个敌人创建一个子弹时,如果你只想让敌人有一个子弹,你应该创建一个新的子弹类 ' instance ',并将其与关键字
bullet相关联,就像你一直在做的那样obj.bullet= Bullet.new(...),但还应该在Enemy的一个方法中引入这个功能(这样你就可以在旧的子弹超出范围后添加一个新的子弹等等)。如果一个索引在一个表中不存在,它将在与问号中的表关联的 metatable 中查找这个索引。例如,假设
a = Enemy:new(),我们想通过a.slogan找到敌人的口号,我们会在a中寻找索引slogan,但没有找到。那么我们会去查找在a的 metatable 中与__index相关联的东西,也就是Enemy。所以我们在Enemy中寻找slogan,它存在,所以我们最终得到 "Gettm!'。在类定义下面添加以下代码
en = Enemy:new() print(en:getBulletOwner()) print(en.slogan)生成
You Gettm!'还要注意
a:b(arg1,arg2)和a.b(arg1,arg2)之间的区别。a:b(arg1,arg2)本质上等同于a.b(a,arg1,arg2),其中a在函数内部绑定到self。这个的例子是:print(en.getBulletOwner())生成
lua: l.lua:22: attempt to index local 'self' (a nil value)而
print(en:getBulletOwner())生成
You