在Lua中访问对象键的一些见解

我只是有点好奇,也有点困惑。在我的lua代码中,我从一开始就设置了一个新的对象。

因此,在实例化新的Enemy对象时,我调用上面的new函数。现在,在同一个文件中,Enemy对象的一个函数例如允许我访问“self.bullet”,当Enemy创建时创建的Bullet对象。它还允许我调用此Bullet瞬时中的trajectBullet函数。

我的问题来自于类似以下调用的内容。如果我尝试设置Bullet的属性,在这种情况下是所有者属性,我会得到一个nil错误,并且不会让我更改它。如果有人能帮我理解如何访问键和属性的方式,那将对我有很大帮助。

点赞
用户2303714
用户2303714

你应该将你的类设置成这样

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)
end

Enemy

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
2013-05-08 10:17:43