Class 具有嵌套表的Lua类实例
简单Lua游戏,简单类如下:Class 具有嵌套表的Lua类实例,class,oop,lua,nested,lua-table,Class,Oop,Lua,Nested,Lua Table,简单Lua游戏,简单类如下: creature = class({ name = "MONSTER BADDY!", stats = { power = 10, agility = 10, endurance = 10, filters = {} }, other_things = ... }) creatureA = creature.new() creatureB = creature.new() creatureA.name = "Frank" creatureB.name
creature = class({
name = "MONSTER BADDY!",
stats = { power = 10, agility = 10, endurance = 10, filters = {} },
other_things = ...
})
creatureA = creature.new()
creatureB = creature.new()
creatureA.name = "Frank"
creatureB.name = "Zappa"
creatureA.stats.agility = 20
creatureB.stats.power = 12
--废话废话
非表值对于每个实例都是独立的,但表值是独立的
在所有实例中共享,如果我在一个实例中修改stats.X值,
所有其他实例都会看到相同的统计表
问题1:我的OO实现有缺陷吗?我尝试了循环,同样的结果出现了,
我的逻辑有根本性的缺陷吗
问题2:你如何让每个生物实例拥有自己的统计表(和子表)
注:我不能将我的类表展平,因为它比示例复杂一点,并且代码的其他部分通过嵌套表实现简化。当创建新的
生物时,如果您不想共享它,您可以始终为它创建一个新的统计表
creature = class({
name = "MONSTER BADDY!",
stats = stats.new({ power = 10, agility = 10, endurance = 10, filters = {} }),
other_things = ...
})
在创建新的生物时,力量、敏捷性等将作为stats
的构造函数中的参数传递,如果您不想共享它,您可以始终为它创建一个新的stats
表
creature = class({
name = "MONSTER BADDY!",
stats = stats.new({ power = 10, agility = 10, endurance = 10, filters = {} }),
other_things = ...
})
Power、agility等将在构造函数中作为参数传递给stats
它的工作原理是这样的,因为类实例在其元表中将类表设置为\uu index
(大多数实现都是这样工作的)
因此,如果您访问creatureA.stats
(并且它在creatureA
上找不到stats
,因此会落到\u索引
),它会返回bioter.stats
。
也许你应该好好读一读
您将无法在类的表构造函数中声明每个实例的变量(除非您将所有内容从类表深度复制到实例,这将非常昂贵)
您必须在类实现使用的任何初始值设定项函数中执行此操作:
creature = class
{
__init = function(self, ...)
self.stats = {power = 10, agility = 10, endurance = 10, filters = {}}
end,
}
它是这样工作的,因为类实例在其元表中将类表设置为\uu index
(大多数实现都是这样工作的)
因此,如果您访问creatureA.stats
(并且它在creatureA
上找不到stats
,因此会落到\u索引
),它会返回bioter.stats
。
也许你应该好好读一读
您将无法在类的表构造函数中声明每个实例的变量(除非您将所有内容从类表深度复制到实例,这将非常昂贵)
您必须在类实现使用的任何初始值设定项函数中执行此操作:
creature = class
{
__init = function(self, ...)
self.stats = {power = 10, agility = 10, endurance = 10, filters = {}}
end,
}
class
不是Lua中的标准函数。你不会说你是不是从罗伯托那里借的,是你自己的还是什么。但我的猜测是,您希望更改新的
方法,以便它对原型进行深度复制,而不是浅层复制:
function deep_copy(v)
if type(v) == 'table' then
local u = { }
for k, v in pairs(v) do
u[k] = v
end
setmetatable(u, getmetatable(v))
return u
else
return v
end
end
(警告:我还没有尝试编译此代码,更不用说运行了。)class
不是Lua中的标准函数。你不会说你是不是从罗伯托那里借的,是你自己的还是什么。但我的猜测是,您希望更改新的
方法,以便它对原型进行深度复制,而不是浅层复制:
function deep_copy(v)
if type(v) == 'table' then
local u = { }
for k, v in pairs(v) do
u[k] = v
end
setmetatable(u, getmetatable(v))
return u
else
return v
end
end
(警告:我还没有尝试编译此代码,更不用说运行了。)您的名为类的函数看起来可疑。我会去寻找最简单的代码。这是一个怪物类文件。没有什么新奇的东西,有些人会说它缺少一些绒毛,但至少下周我自己也可以阅读代码
-- Class object
monster = {}
monster.__index = monster
-- Class methods
function monster.new(name)
local o = {}
o.name = name
o.stats = {power = 10, agility = 10, endurance = 10, filters = {}}
setmetatable(o, monster)
return o
end
function monster:shout()
print('Aaaaaaa! My name is ' .. self.name .. '!')
end
以下是输出:
> lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require 'monster'
> m = monster.new('Katla')
> m:shout()
Aaaaaaa! My name is Katla!
你的名为类的函数看起来可疑。我会去寻找最简单的代码。这是一个怪物类文件。没有什么新奇的东西,有些人会说它缺少一些绒毛,但至少下周我自己也可以阅读代码
-- Class object
monster = {}
monster.__index = monster
-- Class methods
function monster.new(name)
local o = {}
o.name = name
o.stats = {power = 10, agility = 10, endurance = 10, filters = {}}
setmetatable(o, monster)
return o
end
function monster:shout()
print('Aaaaaaa! My name is ' .. self.name .. '!')
end
以下是输出:
> lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require 'monster'
> m = monster.new('Katla')
> m:shout()
Aaaaaaa! My name is Katla!
另外,在类的函数调用中不需要括号。类{}==class({})。此外,对类的函数调用中不需要括号。类{}==类({})。