Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 具有嵌套表的Lua类实例_Class_Oop_Lua_Nested_Lua Table - Fatal编程技术网

Class 具有嵌套表的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

简单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 = "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({})。此外,对类的函数调用中不需要括号。类{}==类({})。