文档章节

lua metatables中操作__index

andrew810810
 andrew810810
发布于 2017/02/17 16:50
字数 288
阅读 5
收藏 0
点赞 0
评论 0
Lua

reference:

http://www.lua.org/manual/5.3/manual.html

__indexThe indexing access table[key]. This event happens when table is not a table or when key is not present in table. The metamethod is looked up in table.

Despite the name, the metamethod for this event can be either a function or a table. If it is a function, it is called with table and key as arguments, and the result of the call (adjusted to one value) is the result of the operation. If it is a table, the final result is the result of indexing this table with key. (This indexing is regular, not raw, and therefore can trigger another metamethod.)

 

__index这个重载,主要是重载了find key的操作,这操作可以让Lua变得有点面向对象的感觉。 所谓__index,说得明确一点,如果我们有两个对象a和b,我们想让b作为a的prototype只需要:

setmetatable(a, {__index = b})

 

metamethod 为function

示例:

Window_Prototype = {x=0, y=0, width=100, height=100}
MyWin = {title="Hello"}
Window = {}
Window.__index = function(table, key)
  return Window_Prototype[key]
end
setmetatable(MyWin,Window)
print(MyWin.title, MyWin.width)

执行结果:

Hello	100

metamethod 为table

Window_Prototype = {x=0, y=0, width=100, height=100}
MyWin = {title="Hello"}
Window = {}
Window.__index = Window_Prototype
setmetatable(MyWin,Window)

print(MyWin.title, MyWin.width)

执行结果:

Hello	100

metamethod 为table简洁的书写方式:

Window_Prototype = {x=0, y=0, width=100, height=100}
MyWin = {title="Hello"}
setmetatable(MyWin, {__index = Window_Prototype})

print(MyWin.title, MyWin.width)

 

© 著作权归作者所有

共有 人打赏支持
andrew810810
粉丝 3
博文 127
码字总数 117648
作品 0
朝阳
[Lua]Lua高级教程Metatables

什么是Metatable metatable是Lua中的重要概念,每一个table都可以加上metatable,以改变相应的table的行为。 Metatables举例 -- 声明一个正常的关系变量 lotable = {} -- 声明空元表变量 lo...

浩浩老师 ⋅ 2015/10/20 ⋅ 0

【Lua高级教程】什么是Metatable举例说明

什么是Metatable metatable是Lua中的重要概念,每一个table都可以加上metatable,以改变相应的table的行为。 Metatables举例 lotable =lometatable =(lotable) 上边的代码也可以写成一行,如...

浩浩老师 ⋅ 2015/09/08 ⋅ 0

Lua学习总结

简述 Lua是一个很小的编程语言,很多人将其与Python高级语言进行比较。 Lua有以下的特点: (1)纯C语言实现,源码小,可以很好地与C/C++融合。可自行编译,生成静态库。 (2)语法简单,灵活...

临峰不畏 ⋅ 2013/10/08 ⋅ 0

Lua一系列很好的技术分享文章链接: 快速掌握 Lua 5.3

Lua一系列很好的技术分享文章链接: 快速掌握 Lua 5.3 --- 该系列文章作者: VermillionTear 作者博客专栏: 快速掌握Lua 5.3(http://blog.csdn.net/column/details/quicklymasterlua5-3.html)...

FreeBlues ⋅ 2016/05/29 ⋅ 2

C/C++和Lua是如何进行通信的?

为了实现Lua和其他语言之间的通信,Lua虚拟机为C/C++提供了两个特性: 一,LuaState状态机 luaState主要是管理一个lua虚拟机的执行环境, 一个lua虚拟机可以有多个执行环境。Lua虚拟机通过维护...

borey ⋅ 2014/09/17 ⋅ 10

lua元表与元方法

lua中每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接的,但是对于两个table类型,则不能直接进行“+”操作。这需要我们进行一些操作。在lua中有一个元表(metata...

安卓农民种苹果 ⋅ 2015/07/31 ⋅ 0

游戏之中的粘合剂---Lua脚本语言

前言: 每当自己想要放弃的时候,可以告诉自己再多撑一天、一个星期、一个月,再多撑一年吧。你会发现拒绝退场的结果令人惊讶! --摘自短篇原创文学 --------------------------------------...

loving_forever_ ⋅ 2016/11/23 ⋅ 0

编译原理之学习 lua 1.1 笔记 (三) 表对象 array 及其相关指令

本节研究 lua 1.1 中的表对象, lua 内部称为 array, 底层实现为 hash, 类似于 php 中的 array(), js 中的 {} 对象等. 先列出待研究的问题: 1. lua 对象的一般语法和使用, 示例. 2. 内部的底层...

刘军兴 ⋅ 2013/12/23 ⋅ 0

编写C函数的技术-《lua程序设计》 27章 学习

1.数组操作 void luarawgeti(luaState * L ,int index,int key) void luarewseti(luaState * L,int index,int key) index表示table在栈的位置,key表示元素在table中的位置 test.lua内容 tab ......

技术小阿哥 ⋅ 2017/11/26 ⋅ 0

lua面向对象编程 《lua程序设计》 16章 笔记

Lua中的table就是一种对象,即它拥有状态、拥有独立于其值的标识(self)、table与对象一样具有独立于创建者和创建地的征集周期 什么叫对象拥有独立的生命周期? Account = {balance = 0} func...

技术小阿哥 ⋅ 2017/11/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长...

颖辉小居 ⋅ 17分钟前 ⋅ 0

利用有限制通配符提升API灵活性(28)

1、参数化类型是不可变的 List<String> 不是List<Object>的子类,但是二者是有联系的 利用有限制的通配符类型处理类似情况 List<? extends Object>(生产者) Collection<? super E>(消费者......

职业搬砖20年 ⋅ 23分钟前 ⋅ 0

ssm框架 +bootstrap分页

这里有两种方式 方式一:自己写分页 方式二:使用插件PageHelper 1.自己写分页 1.1 效果 1.2 实现过程 1.2.1 创建分页公共类 //---------------------------1.属性-------------------------...

Lucky_Me ⋅ 30分钟前 ⋅ 0

Istio

helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/istio.yaml after $ kubectl create namespace istio-system$ kubectl create -f $HOME/ist......

openthings ⋅ 30分钟前 ⋅ 0

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 35分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 36分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 40分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 53分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 58分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部