美文网首页
lua的元表和查询

lua的元表和查询

作者: 双栖木 | 来源:发表于2018-01-19 12:17 被阅读0次

首先给大家看一段lua创建对象的代码

function first:new()
  local o={}
  setmetatable(o,self)
  self.__index=self
  return o
end

估计大家都敲过好多遍了,这段代码的含义就是:创建一个o,将自身设置为o的元表,然后将自身__index元方法设置为查找自身,但为什么这么做呢?
还有另外一个创建对象的方法

function first:new()
  local o={}
  setmetatable(o,{__index=self})
  return o
end

大家应该知道这两个创建的结果是相同的
这个要从table查询的方式说起:
当访问一个table中不存在的字段时,table就会去查找它元表的__index字段,所以要找到这个不存在的字段,是要两个条件,首先要有元表,其次元表有__index字段。所以第一个案例首先使用setmetatable(o,self)给o设置一个元表,但这时候去访问self的字段会返回nil,因为self中没有__index字段,所以需要定义self.__index=self。
这时第二个案例大家应该也就理解了,setmetatable(o,{__index=self}),就是将一个table {__index=self}设置为o的元表,查询的时候o首先找到它的元表{__index=self},然后在元表中找到__index字段,由__index给它带路,找到了self。
下面是一些有意思的事例,帮助理解

local first={a=100,b=200}
local second={a=300,b=400}

function first:new()
  local o={}
  setmetatable(o,self)
  self.__index=second
  return o
end
function second:new()
  local o={}
  setmetatable(o,first)
  self.__index=first
  return o
end
-- 这里的调用顺序会有影响哦,先调用first:new(),然后first.__index才存在哦
local t1=first:new()
local t2=second:new()
print(t1.a)
print(t2.a)

答案是:
300
300

local first={a=100,b=200}
local second={a=300,b=400}
function first:new()
  local o={}
  setmetatable(o,self)
  self.__index=self
  return o
end
function second:new()
  local o={}
  setmetatable(o,first)
  first.__index=second
  return o
end
-- 可以试一下将t1和t2的赋值顺序调换,查看结果
local t1=first:new()
local t2=second:new()
print(t1.a)
print(t2.a)

答案是:
300
300

function second:new()
  local o={}
  setmetatable(o,{__index={a=55}})
  return o
end
local t2=second:new()
print(t2.a)

答案是:
55

相关文章

  • lua的元表和查询

    首先给大家看一段lua创建对象的代码 估计大家都敲过好多遍了,这段代码的含义就是:创建一个o,将自身设置为o的元表...

  • 学习常用链接

    //Lua Lua table详解 Lua 元表详解 云风博客 //Unity Unity知识点 栈和队列 Uni...

  • Lua中元表的学习

    Lua本身没有面向对象的思想,但是可以根据表、元表、元方法来靠近它 一、元表与元方法的概念Lua中每个值都可具有元...

  • 2018-08-02

    lua实现继承,重载和多态(上) *讲到lua的继承等面向对象的实现,首先得讲一下lua中的几个元方法和元表. s...

  • 通用分页查询表的存储过程

    通用分页查询表的存储过程 存储过程: lua

  • Lua实现继承

    Lua元表使用 中的__index元方法可以实现面向对象和继承关系: lua中没有类的概念,只有table,但可以...

  • Lua 实现面向对象 (原创)

    要理解Lua是如何实现面向对象的。首先要熟悉Lua元表的相关知识,可以阅读我上一篇文章《Lua元表 (Metata...

  • Lua 元表和元方法

    table 作为 Lua 中唯一的数据结构,我们可以利用 table 实现面向对象编程中的类、继承、多重继承等等。...

  • Lua 元表(Metatable)

    学习网站Lua 元表(Metatable)

  • Lua学习

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

网友评论

      本文标题:lua的元表和查询

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