lua metatable 和 _index

中文博客解释:

http://www.cnblogs.com/simonw/archive/2007/01/17/622032.html

metatable:http://www.lua.org/pil/13.html

表的通用方法中,有些缺失的, 使用metatable可以定义表的这些默认方法:

add, sub, mul, div, mod, pow, unm, concat, len, eq, lt, le, tostring, gc, index, newindex, call...

__index: http://www.lua.org/pil/13.4.1.html

当访问表中无此元素, 则查询metatable中是否有__index, 如果有则获取_index调用结果, 如果没有__index则返回nil

__newindex : http://www.lua.org/pil/13.4.2.html

  当设置表中不存在的key时候, 触发调用metatable 的 __newindex, 如果没有__newindex则设置到目标表的属性上, 如果存在__newindex, 则执行它。

例子:

__index __newindex 对比:

local Bird = {CanFly = true}

function Bird:New()
local b = {}
setmetatable(b, self)
self.__index = self
--self.__newindex = self
return b
end local Ostrich = Bird:New() --Bird.CanFly is true, Ostrich.CanFly is true
Ostrich.CanFly = false --Bird.CanFly is true, Ostrich.CanFly is false print("Ostrich.CanFly="..tostring(Ostrich.CanFly))
print("Bird.CanFly="..tostring(Bird.CanFly))

其他测试实验:

--定义2个表
a = {, }
b = {, }
--用c来做Metatable
c = {}
--重定义加法操作
c.__add = function(op1, op2)
for _, item in ipairs(op2) do
table.insert(op1, item)
end
return op1
end
--自定义方法
c.print = function()
print("c print!");
end
--将a的Metatable设置为c, 报错,print为nil NOK
--[[
setmetatable(a, c)
a.print()
]]
--将a的Metatable设置为c, 调用c定义的内置函数 OK
--d现在的样子是{5,6,7,8}
--[[
setmetatable(a, c)
d = a + b
for _, item in ipairs(d) do
print(item)
end
]]
--将a的__index设置为c, 可以调用c定义的print OK
--[[
setmetatable(a, {__index = c})
a.print()
]]
--将a的metatable设置为c, 可以调用c定义的print OK
--[[
c.__index = c
setmetatable(a, c)
a.print()
--]]
--将a的__index不能直接复制为c, 报错, NOK
--[[
a.__index = c
a.print()
--]]
--将a的__index设置为c, 报错a不能执行算出运算, NOK
--[[
setmetatable(a, {__index = c})
d = a + b
for _, item in ipairs(d) do
print(item)
end
]]
--将a的__add设置为c的__add, OK
--[[
setmetatable(a, {__add=c.__add})
d = a + b
for _, item in ipairs(d) do
print(item)
end
--]]
-- 可以调用自定义方法, 和 内置方法 OK
--[[
setmetatable(a, {__index = c, __add=c.__add})
a.print()
d = a + b
for _, item in ipairs(d) do
print(item)
end
--]]

lua metatable 和 _index 实验的更多相关文章

  1. Lua metatable & metamethod

    [Lua metatable & metamethod] Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接的,但是对于两个table类型,则不能直接进行“+”操 ...

  2. lua metatable(元表)

    lua metatable (元表) 概述 普通 table 类型的表仅能够做一些单表操作, 无法进行一些特殊的以及两个表的操作, 比如 table1 + table2, print(table3) ...

  3. lua metatable和metamethod元表和元方法

    Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时, ...

  4. lua面向对象封装及元表(metatable)性能测试

    Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- ...

  5. lua表类型

    Lua的表的定义: typedef struct Table { CommonHeader; lu_byte flags; lu_byte lsizenode; /* log2 of size of ...

  6. 基于Lua插件化的Pcap流量监听代理

    1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...

  7. elastic search使用总结

    1. elasticsearch安装 官方下载地址:https://www.elastic.co/downloads/elasticsearch 解压文件 elasticsearch-2.4.0.zi ...

  8. lua-C++ userdata使用

    lua-C++ userdata使用 所负责的产品使用非常灵活,可设置的参数上千个,而且还支持用户用lua进行流程控制,所以开发中要用到很多lua.C++混合编程.之前对这些也还是一知半解,只会依葫芦 ...

  9. ROS学习笔记1-引言

    该学习笔记参考ROS官方wiki的内容,见:http://wiki.ros.org/ROS/Introduction 什么是ROSROS的全称是Robot Operating System,即机器人操 ...

随机推荐

  1. Ubuntu 12.04 LTS 及ubuntu14.10 -- NFS安装

    在Linux 服务器上配置好NFS 根文件系统后,在单板侧挂载NFS 文件系统,具体操作如下:ifconfig eth0 hw ether 00:10:85:18:01:84 /*配置MAC地址*/i ...

  2. jQuery 实现带下拉提示且自动填充的邮箱

    /* ** 本文例子所引用的jQuery版本为 jQuery-1.8.3.min.js ** Author:博客园小dee*/ 本文用 jQuery 实现一个用户输入字符时出现能够提示邮箱后缀名的下拉 ...

  3. #define与运算精度问题探究

    #include <stdio.h> #define SQR(X) X*X int main(int argc, char* argv[]) { ; ; ; printf("SQ ...

  4. [转]PHP高效率写法(详解原因)

    1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍.   当然了,这个测试方法需要在十万级以上次执行,效果才明显.   其实静态方法和非静 ...

  5. 本田--CRV

    名称:CR-V 类型:紧凑型SUV 排量:2L/2.4L 变速箱:CVT无级变速 价格:18-25W 品牌:本田 生产:东风本田 历史:1995年第一代 外观特点:没啥特点= =空间算大的

  6. laravel paginate动态分页

    1.router Route::get('product', function(){ $products = App\Product::paginate(10); return view('produ ...

  7. ②springMVC入门

    1 1.1      需求 以案例作为驱动. springmvc和mybaits使用一个案例(商品订单管理). 功能需求:商品列表查询 1.2      环境准备 数据库环境:mysql5.1

  8. java Channel

    Channel Channel与流 基本上,所有的 IO 在NIO 中都从一个Channel 开始.Channel 有点象流.数据可以从Channel读到Buffer中,也可以从Buffer 写到Ch ...

  9. 应用github pages创建自己的个人博客

    首先你需要注册自己的github账号 1.登录或者注册github,登录之后点击右上角的“+”号,选择“New repository”菜单,创建仓库,用于存储和博客相关的源文件. 2.跳转页面将填写域 ...

  10. 在HCI层看从inquiry的整个过程

    一.概述    在windows下寻找远端蓝牙设备,从最开始的inquiry寻找设备,到连接设备,到最后配对完成,整个HCI层所发的command和event以及Data包可以反应整个蓝牙的inqui ...