Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
Lua 为什么第一个示例构造函数在“self”上设置了“索引”?_Lua_Lua Table - Fatal编程技术网

Lua 为什么第一个示例构造函数在“self”上设置了“索引”?

Lua 为什么第一个示例构造函数在“self”上设置了“索引”?,lua,lua-table,Lua,Lua Table,我刚开始看Lua,我正在看 我不明白为什么构造器不仅仅是 function Account:new (o) o = o or {} setmetatable(o, {__index = self}) return o end 我将非常感谢任何有助于理解这一点的帮助 编辑: @Egor观察到第二种方法会创建太多的元表。好吧,我明白了(事实上,这是显而易见的)。但是第一种方法仍然让人感到奇怪(例如,它在帐户上反复设置\uu索引)。也许这样的事情会同时遭到反对 Account = {ba

我刚开始看Lua,我正在看

我不明白为什么构造器不仅仅是

function Account:new (o)
  o = o or {}
  setmetatable(o, {__index = self})
  return o
end
我将非常感谢任何有助于理解这一点的帮助

编辑:

@Egor观察到第二种方法会创建太多的元表。好吧,我明白了(事实上,这是显而易见的)。但是第一种方法仍然让人感到奇怪(例如,它在
帐户上反复设置
\uu索引
)。也许这样的事情会同时遭到反对

Account = {balance = 0}
Account_meta = {__index = Account}

function Account:new (o)
  o = o or {}
  setmetatable(o, Account_meta)
  return o
end

我认为这种方法的唯一原因是将其与未来的继承联系起来

那里的继承实现使用
SpecialAccount=Account:new()
SpecialAccount
创建原型,然后使用
instance=SpecialAccount:new()
创建
SpecialAccount
的新实例


如果我们确实想让这种方法起作用,这两个调用中的一个必须将
SpecialAccount.\uu index
设置为
SpecialAccount
。假设我们只想在原型/元表/类上设置
\u索引
,那么它必须是第二个。在每个对象创建过程中,这会花费我们一次重复的赋值,但我想这并不重要,因为这只是一个例子。

我认为这种方法的唯一原因是将它与对象中的继承联系起来

那里的继承实现使用
SpecialAccount=Account:new()
SpecialAccount
创建原型,然后使用
instance=SpecialAccount:new()
创建
SpecialAccount
的新实例


如果我们确实想让这种方法起作用,这两个调用中的一个必须将
SpecialAccount.\uu index
设置为
SpecialAccount
。假设我们只想在原型/元表/类上设置
\u索引
,那么它必须是第二个。在每个对象创建过程中,这会花费我们一次重复的赋值,但我想这对于一个示例来说并不重要。

在第二个示例中,您正在为每个对象创建新的元表。太耗内存了。@EgorSkriptunoff谢谢。您可以对我的编辑发表意见吗?元表可能与类本身是同一个表,这将再保存一个表。@EgorSkriptunoff当然可以。但假设我不是在一个每个字节的内存都很重要的系统上工作;有没有其他理由不使用第三种方法?谢谢第三种方法完全可以。在第二个示例中,您为每个对象创建了新的元表。太耗内存了。@EgorSkriptunoff谢谢。您可以对我的编辑发表意见吗?元表可能与类本身是同一个表,这将再保存一个表。@EgorSkriptunoff当然可以。但假设我不是在一个每个字节的内存都很重要的系统上工作;有没有其他理由不使用第三种方法?谢谢第三种方法完全可以。
Account = {balance = 0}
Account_meta = {__index = Account}

function Account:new (o)
  o = o or {}
  setmetatable(o, Account_meta)
  return o
end