美文网首页
lua中metatable使用误区

lua中metatable使用误区

作者: 子夜书案 | 来源:发表于2020-02-29 08:12 被阅读0次

local component = {}

component.dirty = false

component.change = function() print("component in change") component.dirty = true end component.__index = component

--component.__newindex = component

local a_component = setmetatable({},component)

a_component.change() print(string.format("1~~~~~~~ a_component dirty = %s",a_component.dirty))

a_component.dirty = false

print(string.format("2~~~~~~~ a_component dirty = %s",a_component.dirty))

a_component.change()

print(string.format("3~~~~~~~ a_component dirty = %s",a_component.dirty))

local b_component = setmetatable({},component)

print(string.format("4~~~~~~~ b_component dirty = %s",b_component.dirty))

观察下,你认为这段程序会输出什么?

从设计层面来说,a_component,和b_component肯定不希望用到的值相互干扰,希望它们是独立的两个class。

但实际的情况是不是像结果一样呢?

看实际输出:

component in change

1~~~~~~~ a_component dirty = true

2~~~~~~~ a_component dirty = false

component in change

3~~~~~~~ a_component dirty = false

4~~~~~~~ b_component dirty = true

但实际的情况是不是像结果一样呢?

并不是,调用原表中才有的方法,改变的是原表中的元数据,而不是子表的数据。

上面程序如果你打印a_component和component各有一个 dirty字段,两者是没有关联的。

如果把上面注释掉的

--component.__newindex = component

给打开,结果会怎样?

输出如下:

component in change

1~~~~~~~ a_component dirty = true

2~~~~~~~ a_component dirty = false

component in change

3~~~~~~~ a_component dirty = true

4~~~~~~~ b_component dirty = true

这时你会发现,a_component和b_componet中都没有dirty这变量。

说明所有的改动都是对component的改动。

相关文章

  • lua中metatable使用误区

    local component = {}component.dirty = falsecomponent.chan...

  • Lua 元表元方法(Metatables and Metamet

    1、Every value in Lua can have a metatable. This metatable...

  • lua元表

    1、Lua 元表(Metatable) setmetatable(table,metatable): 对指定tab...

  • Lua 元表(Metatable)

    学习网站Lua 元表(Metatable)

  • Lua Metatable

    算数运算和逻辑运算(类似操作符重载) 库定义的元方法 table访问的元方法__index 如果访问table中字...

  • Lua----元表(Metatable)

    什么是元表 This metatable is an ordinary Lua table that define...

  • 2017.5.26

    lua学习:metatable 元方法,元表 lua 中的任何一个值都有其预定义的一套操作,这些操作都是在元表中定...

  • Lua-元表

    元表Metatable Lua提供了元表,允许我们改变table的行为,每个行为关联了对应的元方法。 例如,使用元...

  • Lua学习

    Lua 学习 元表 setmetatable(table,metatable): 对指定table设置元表(met...

  • lua元表(Metatable)

    Lua 提供的元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。 __inde...

网友评论

      本文标题:lua中metatable使用误区

      本文链接:https://www.haomeiwen.com/subject/lhqmchtx.html