开发者

Lua MiddleClass. How to pass "self" from another file

开发者 https://www.devze.com 2023-04-03 15:17 出处:网络
Say, If i have two or more files using the middleclass extension more or less like this. I omitted some of the obvious middleclass implementation code.

Say, If i have two or more files using the middleclass extension more or less like this. I omitted some of the obvious middleclass implementation code.

File A:

function Battlefield:initialize()
    self.varA
    self.varB
end

function Battlefield:attack()
   --I want to use self.varA here
end

File B

BattlefieldInstance = Battlefield:new()

function doStuff()
    BattlefieldInstance:attack()
end

I know this structure more or less works because i already use it plenty on my project, but my problem is that i want to use these self variables. Normally a self instance is passed between functions开发者_Go百科 inside the same file to do this, but when i do it from another file i obviously can't pass self, because it would be another self, and i need the self from the file where the function is located. Sorry if my question is a bit confusing. I'll try and clarify any questions there are.


I have no idea what middleclass is, but I think you're confusing yourself. The way self works in Lua is a function that looks like function Battlefield:attack() is absolutely the same thing as function Battlefield.attack(self). In other words, self is just an implicit first parameter to the function. And a method call instance:attack() is exactly equivalent to instance.attack(instance) (though it won't evaluate instance twice if you use an expression there).

In other words, BattlefieldInstance:attack() should do exactly what you want.


'self' is a keyword that means 'the current object'. So in the case of Battlefield functions, 'self.varA' inside the function is the same variable as 'Battlefield.varA' outside the function.


Middle Class was a lib that I first saw developed for Love2D; I assuming its the same one that corona is using? (I've used Corona a fair bit... but not Middle Class's OOP system)

either way you can also try using meta tables directly, as so:

---FILE A---

Battlefield= {}
Battlefield.__index = Battlefield

function Battlefield:new()
    return setmetatable({var1 = 'somedata', var2 = 'somemodata', var3 = 'lotsodata'}, Battlefield)  
end

function Battlefield:attack()
    print(self.var1)
end


---FILE B---

BattlefieldInstance = Battlefield:new( )

function doStuff()
    BattlefieldInstance:attack()
end

and that'll print out self.var1 (somedata).

Hope this helps!

0

精彩评论

暂无评论...
验证码 换一张
取 消