Lua小技巧
来公司以后,业务逻辑都用lua写。写了好长时间了,到最近才觉得有点掌握了Lua的灵活。最近用Lua写了个类似集合一样的东西,如果两次向集合里放入同一个元素,就会报错,方便检查配置。代码如下:
-- keep data across rule
local m = {}
local where_defines = {}
local getinfo = debug.getinfo
name2id = setmetatable({}, {
__index = m,
__newindex = function(self, key, value)
if not m[key] then
m[key] = value
where_defines[key] = getinfo().short_src
else
local new_define = getinfo().short_src
local where_define = where_defines[key]
print(where_define.." defines "..key.." : "..m[key])
print(new_define.." defines "..key.." : "..value)
assert(false, "redefinition of key:"..key)
end
end
})
local M = {
name2id = name2id,
}
return M
由于Lua的__index hook不完整,只有在数据不存在的时候,才会索引元表的__index,所以需要将数据藏起来。之前是用一个key为data,value是空表的子表去存实际数据,这样做会有一个隐患,当塞进去的key是data,就会把其他数据覆盖掉。后来同事提醒,可以用upvalue,先声明一个本地table m,然后在元表方法里引用之,这样外层就不会误改数据域了。要找回m,可以从元表中查回来。
Lua小技巧的更多相关文章
- lua 小技巧
lua 小技巧 把常用的工具函数添加到 _G 里面,所有的文件都可以直接调用: ``` lua -- 在 a 文件中将工具函数添加到 _G: _G.IsEmptyStr = function(str) ...
- lua学习笔记11:lua中的小技巧
lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一. 巧用or x = x or v 等价于: if not x then x = v end 假设x为nil或false,就给他赋 ...
- lua调试小技巧
lua中,如果碰到某个属性值改变了,但是修改的地方又特别多,调试就特别麻烦了,有个小技巧,直接贴代码 local m = { __index = function( t, k ) ...
- 前端网络、JavaScript优化以及开发小技巧
一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...
- Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...
- 分享两个BPM配置小技巧
1.小技巧 流程图修改后发布的话版本号会+1,修改次数多了之后可能会导致版本号很高,这个时候可以将流程导出,然后删除对应的流程包再导入,发布数据模型和流程图之后,版本清零 2.小技巧 有的同事入职后使 ...
- linux系统维护时的一些小技巧,包括系统挂载新磁盘的方法!可收藏!
这里发布一些平时所用到的小技巧,不多,不过会持续更新.... 1.需要将history创建硬链接ln 全盘需要备份硬链接 ln /etc/xxx /home/xxx 2.root用户不可以远程 /et ...
- JS处理事件小技巧
今天,就分享一下我自己总结的一些JS的小技巧: ①防止鼠标选中事件 <div class="mask" onselectstart="return false&qu ...
- iOS:小技巧(不断更新)
记录下一些不常用技巧,以防忘记,复制用. 1.获取当前的View在Window的frame: UIWindow * window=[[[UIApplication sharedApplication] ...
随机推荐
- Leetcode 详解(Valid Number)
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- python爬取数据保存入库
import urllib2 import re import MySQLdb class LatestTest: #初始化 def __init__(self): self.url="ht ...
- 基于UDP协议模拟的一个TCP协议传输系统
TCP协议以可靠性出名,这其中包括三次握手建立连接,流控制和拥塞控制等技术.详细介绍如下: 1. TCP协议将需要发送的数据分割成数据块.数据块大小是通过MSS(maximum segment siz ...
- Apache安装与属性配置
Apache 事先创建进程 按需维持适当的进程 模块块设计,核心比较小,各种功能都模块添加(包括php) 支持运行配置,支持单独编译模块 支持多种方式的虚拟主机配置 Socket IP ...
- Mvc4学习笔记一(Ajax.ActionLink)
<style type="text/css"> #left {width:200px; min-height:500px;border:1px solid #ccc;f ...
- curl post
//Post方式实现 $url = "http://localhost/web_services.php"; $post_data = array ("username& ...
- IP地址及其子网划分
说实话,弄到子网划分的时候还是及其头晕的,又是这又是那的,现在我们来讲解一下这些东西, 首先我们来介绍一下IP地址,要弄清子网划分,子网掩码首先还是要弄清IP地址的划分 IP地址是给Internet上 ...
- c# 字符串操作
一.字符串操作 //字符串转数组 string mystring="this is a string" char[] mychars=mystring.ToCharArray(); ...
- js拖拽效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Microsoft .NET Framework 4.6.1
适用于操作系统平台:Windows 7 SP1.Windows 8.Windows 8.1.Windows 10.Windows Server 2008 R2 SP1.Windows Server 2 ...