table中index、newindex、rawget、rawset的一段代码及理解

 1 print("lua 中 table 就是一种对象的体现")
 2
 3
 4 function string:xsplite( delimiter )
 5     local tmptb = {}
 6     if self == nil or self==‘‘ or delimiter==nil then
 7         return nil
 8     elseif delimiter == ‘‘ then
 9         table.insert(tmptb,self)
10         return tmptb
11     else
12         self = self .. delimiter
13         for s in self:gmatch("(.-)"..delimiter) do
14             table.insert(tmptb,s)
15         end
16         return tmptb
17     end
18 end
19
20 str = ‘lua "/Users/xuyang/Desktop/Test_demo/Lua/table_obj.lua"‘
21 ttb = str:xsplite(‘/‘)
22
23 -- print(unpack(ttb))
24 -- print(table.concat( ttb, "\n", 1, #ttb ))
25
26
27 --关闭lualde的代码提示功能
28 mm = {zxy=‘UU的‘} --预计访问的表
29
30
31 mt = {}
32 --mt.__index = {xyz=‘老子的‘}    --处理取值行为,与下面效果等同
33 mt.__index = function ( table,key)
34     if key==‘xyz‘ then
35         key = ‘老子的‘
36         return key
37     end
38 end    --处理取值行为
39
40 mt.__newindex = function ( table,key,value )   --处理赋值行为
41     if key == ‘xyz‘ then
42         rawset(table,"xyz",‘你大爷‘)   -- rawset(...) 进行赋值
43     else
44         table.key=‘滚犊子‘
45     end
46 end
47 setmetatable(mm, mt)    --设置mm表的默认值为mt,此时mm会继承mt所有的元素属性值
48
49 print(‘mm.zxy‘,mm.zxy)   --正常的表访问
50
51 print(‘mm.xyz‘,mm.xyz)   --访问表中没有的元素
52 print(‘mm.xyz‘,rawget(mm,xyz))   --rawget方法只访问当前table,不访问 __index元方法的赋值
53 --------------------
54 mm.xyz = "嘿嘿嘿"  --给表中不存在的索引进行赋值:当给不存在的表进行赋值时,会检查是否__newindex元方法,如存在则执行该方法进行赋值
55 print(‘嘿嘿嘿 >>>‘,mm.xyz)
56
57 -- mm.zzzs = "嘻嘻"  --该赋值操作会导致overflow
58 print(‘嘻嘻 >>>‘,rawget(mm,mm.zzzs))  

结果输出:

1 lua 中 table 就是一种对象的体现
2 mm.zxy    UU的
3 mm.xyz    老子的
4 mm.xyz    nil
5 嘿嘿嘿 >>>    你大爷
6 嘻嘻 >>>    nil

理解概述

__index是

__newindex是

rawset是

rawget是

总结:取值的元方法定义、赋值的元方法定义、设置new的元方法值(并返回)、仅获取当前表,不获取元方法定义(使index无效)

时间: 2024-10-13 08:52:05

table中index、newindex、rawget、rawset的一段代码及理解的相关文章

C# 中写得很不错的一段代码摘出来

private void LikeMyworkEvent(EditedImg img, bool islike) //点赞自己的作品 { if (ApplicationModel.userInfo != null) { OffLineController.Instance.OffLine(); return; } if(img.workId == null || img.workId == "") //这个作品还没有自己的作品id,需要先上传 { UploadUserEditedFil

关于阮一峰老师es6(第三版)中管道机制代码的理解浅析

最近正在学习阮一峰老师的es6(第三版)教材,在学到第七章<函数的扩展>中的箭头函数嵌套时,文中提到了一个关于“管道机制”的示例,文中源代码如下: //es6(第三版)教材中的管道机制源代码: const pipeline = (...funcs) => val => funcs.reduce((a, b) => b(a), val); const plus1 = a => a + 1; const mult2 = a => a * 2; const addThe

跟我一起了解Lua语言中的_index,newindex,rawget和rawset

前言:理解Lua语言中的__index, __newindex, rawget和 rawset 在谈及Lua中的__index, __newindex, rawget和rawset前,需要理解Lua中的元表这个概念. 一.元表的概念 对Lua中元表的解释: 元表可以改变表的行为模式. 这里举个例子: Window = {} Window.prototype = { x = 0 , y = 0 , width = 100 , height = 100, } Window.mt = {} funct

转:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

0.参考文献 Table Scan, Index Scan, Index Seek SQL SERVER – Index Seek vs. Index Scan – Diffefence and Usage – A Simple Note oracle表访问方式 Index Seek和Index Scan的区别以及适用情况 1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找

js导出table中的EXCEL总结

导出EXCEL一般是用PHP做,但是项目中,有时候PHP后端工程师返回的数据不是我们想要的,作为前端开发工程师,把对应的数据编号转换为文字后,展示给用户,但是,需求要把数据同时导出一份EXCEl.无奈之下,我只能用js导出table中的数据了. 导出EXCEl一般是自己人用的,所以用js导出,因为js导出EXCEL一般情况下兼容性不是很好,很多只是兼容IE浏览器,还要设置在工具栏中进行设置才能导出,因为会相对比较烦.下面介绍几种方法: 一.js导出EXCEl带单元格合并[已验证,比较好用] //

【2017-06-29】在登录页面自动返回上次请求页面、Js获取table中的行数与列数

一.在登录页面自动返回上次请求页面 Request.UrlReferrer比如 if (Request.UrlReferrer != null) { //如果能获取来路地址 Response.Redirect(Request.UrlReferrer.ToString());} else { //没有来路地址 Response.Redirect("index.aspx"); 二.Js获取table中的行数与列数 var table =document.getElementById(&qu

查看Table的Index

1,查看table中的index的定义 SELECT o.object_id, o.name, i.index_id, i.name as index_name, i.type_desc as index_type, ic.index_column_id, c.name AS columnname, iif(ic.is_descending_key=1,'desc','asc') as sort_direction, ic.key_ordinal as index_key_ordinal, ic

table中tr或者td的点击事件

直接把时间添加到table或者tbody上,只有下面的tr或者td才能促发事件,通过e.target可以获得当前点击tr或者td,这样就可以进行查询或者删除操作了 如果是删除,直接e.target.remove();删除的就是当前点击的元素 如果是查在table中对应的下标,可以用e.target.index(),获得的就是当前元素在其父元素下的下标. 注意:表格是刷新渲染出来的还是异步加载出来的,区别时间代理(要绑定在页面已有元素下,只有tr或者td才能响应).

程序动态定位到 af:table 中的某一行

环境:Jdeveloper 12c 代码如下: RowKeySet rks = new RowKeySetImpl(); CollectionModel model = (CollectionModel) empTable.getValue(); model.setRowIndex(10); Object key = model.getRowKey(); rks.add(key); empTable.setSelectedRowKeys(rks); 说明:empTable绑定到af:table,