Lua类对象?

问题描述:

我是Lua的新手,我想知道是否有一种方法可以让许多类对象在我的情况下生成不同的项目,就像在C#或Java之类的OOP语言中一样。我在说什么的一个例子是一类像这样在Lua ...Lua类对象?

weapon = {} 

function weapon.load() 
{ 
    weapon.name = "CHASE'S BUG" 
    weapon.damage = 1 
    weapon.rare = "Diet Valley Cheez" 
    weapon.hottexture = love.graphics.newImage("/ledata/invalid.png") 
    weapong.playtexture = love.graphics.newImage("/ledata/invalid.png") 
    weapon.dura = 1 
    weapon.type = "swing" 
} 

但是,在一个主类,你能有这样的类,它会像这样做的东西,如C#的新对象

weapon Dagger = new weapon(); 
Dagger.name = "Dagger of Some Mountain" 
... 

有没有办法在Lua中做到这一点?

Lua是面向对象的,但它不喜欢的Java/C++/C#/ Ruby的,等等,有没有本地类,创建新的对象的唯一方法是复制现有的对象。这就是为什么它被称为prototype language(如JavaScript)。

阅读Programming in Lua Chapter 16。你可以使用metatable来模拟正常的OOP。

+0

所以我能做出像匕首=武器Dagger.name =“匕首” ...... – freemann098

+0

@ freemann098是的,你可以,Lua中提供了制造工具,你需要的工具一些工作,但。阅读这本书,这是每个Lua程序员应该阅读的书。 –

+0

我也会建议[MiddleClass](https://github.com/kikito/middleclass):它是一个为Lua实现Object-Orientation的库。 –

有很多方法。这是一个简单的。不是很多OOP,你没有继承和一些其他的东西。但我认为这将适用于你的情况。

function weaponFire() 
    print "BANG BANG" 
end 

function newWeapon (opts) 
    local weaponInstance = {} 

    weaponInstance.name = opts.name 
    weaponInstance.damage = opts.damage 

    weapon.fire = weaponFire 

    return weaponInstance 
end 

由于您使用love2d标记了标签,因此您可以查看middleclass。那里有docs。还有更多的插件,如stateful,主要用于游戏和love2d。

另一种方式去了解它是使用像这样的表(使用汽车的例子):

Car = {} 
    Car.new = function(miles,gas,health) 
     local self = {} 

     self.miles = miles or 0 
     self.gas = gas or 0 
     self.health = health or 100 

     self.repair = function(amt) 
      self.health = self.health + amt 
      if self.health > 100 then self.health = 100 end 
     end 

     self.damage = function(amt) 
      self.health = self.health - amt 
      if self.health < 0 then self.health = 0 end 
     end 

     return self 
    end 

它创建了一个名为“汽车”表这将是一个类的等价物,不是一个实例,那么它在Car类中定义了一个“new”方法,它返回一个带有变量和函数的汽车实例。使用这种实现的一个例子:

local myCar = Car.new() 
    print(myCar.health) 
    myCar.damage(148) 
    print(myCar.health) 
    myCar.repair(42) 
    print(myCar.health)