Class 从lua中的字符串实例化类的实例

Class 从lua中的字符串实例化类的实例,class,lua,game-development,love2d,Class,Lua,Game Development,Love2d,我有一个生成敌人的功能,可以从列表中随机选择一个实体名称。这些名称是字符串,例如“spider”、“mole”、“bee”等。然后,我想获取该字符串并使用它创建实体的实例。每个实体都有自己的脚本和行为 local entity = ENTITIES[math.random(1, #ENTITIES)] new_entity = entity({ x = 0, y = 0 }) 其中实体可以是“鼹鼠”,而不是

我有一个生成敌人的功能,可以从列表中随机选择一个实体名称。这些名称是字符串,例如“spider”、“mole”、“bee”等。然后,我想获取该字符串并使用它创建实体的实例。每个实体都有自己的脚本和行为

local entity = ENTITIES[math.random(1, #ENTITIES)]
        
     new_entity = entity({
            x = 0, 
            y = 0
     })
其中实体可以是“鼹鼠”,而不是

if entity == 'mole' then Mole({
            x = 0,
            y = 0
        })
elseif entity == 'spider' then Spider({
我确信这个问题已经得到了回答,但我不太知道如何查找它。
谢谢

最简单也是最好的方法是简单地使用构造函数表:

local ENTITY_CONSTRUCTORS  = {
spider=Spider,
mole=Mole,
bat=Bat,
...
}
然后:

local entity = ENTITIES[math.random(#ENTITIES)]
local object = ENTITY_CONSTRUCTORS[entity]{ x=0, y=0 }
您甚至可以通过将构造函数直接存储在ENTITIES表中来进一步简化:

ENTITIES = { Spider, Mole, Bat }
local object = ENTITIES[math.random(#ENTITIES)]{ x=0, y=0 }

为什么不将实体构造函数存储在
ENTITIES
中,并将其与一个数组配对,该数组包含可以使用random获得的所有密钥
localentity=ENTITIES[ENTITIES_KEYS[math.random(1,#ENTITIES_KEYS)]
FYI,
Mole({})
(如果Mole在全局名称空间中定义)是
\u G[“Mole”]({})的同义词。Afaik在Lua的最新版本中,他们引入了
_ENV[“Mole”]({})
作为
Mole({})
始终(无ifs)的同义词。