Lua学习笔记(5)table的长度
lua-5.1.5
疑问
lua获取table长度的接口有很多:
table.getn()
table.maxn()
’#’操作符
推荐一篇文章:浅析Lua中table的遍历
但是也会出现神奇的情况,请看下面一小段代码:
local t = {111, x = 222, nil, 333, [10] = 555, {}, nil, nil}
print(table.getn(t)) -- 4
print(#t) -- 4
print(table.maxn(t)) -- 10
--local t = {111, nil, x = 222, nil, 333, [10] = 555, {}, nil, nil}
--local t = {111, x = 222, nil, 333, [10] = 555, nil, {}, nil, nil}
如果随机在t中插入nil,结果会让你大吃一惊,丈二和尚摸不着头 ...
Lua 正则表达式
Lua字符串匹配
与正则相关的函数
str = "{1:[1,2,3],2:{idx2:2,level:60,reward_idx:2001,ring:100},test:{1:100,2:200}}"
string.find(s, pattern[, init[, plaub]])
在字符串 s 中匹配 pattern,如果匹配成功,则返回第一个匹配到的子串的起始索引和结束索引,如果 pattern 中有分组,那么分组匹配的内容也会接在两个索引值后面返回;如果匹配失败则返回 nil。
第三个可选参数 init 指明从哪里开始搜索,默认值为1,可以是负值。
第四个可选参数 plain 为true 时,关闭模式匹配机制,pattern 作为普通字符串进行匹配。
string.find(str, '1,2,3')
5 9
string.find(str, '%a+')
15 17
string.find(str, '(%d+),(%d+),(%d+)')
5 9 "1" "2" ...
lua_code_cache
lua_code_cache
syntax: lua_code_cache on | off
default: lua_code_cache on
context: http, server, location, location if
Enables or disables the Lua code cache for Lua code in *_by_lua_file directives (like set_by_lua_file and
content_by_lua_file and Lua modules.
When turning off, every request served by ngx_lua will run in a separate Lua VM instance, starting from the 0.9.3 release. So the Lua files referenced in set_by_lua_file,
content_by_lua_file, access_by_lua_file,
and etc will not be ca ...
lua读取redis数据的null判断
最近在配合移动端调试的时候,被抓去debug一个在清除redis缓存之后才会出现的网关错误。于是打开服务器上的log定位到类似错误:
1[error] 7#7: *12030 lua entry thread aborted: runtime error: /data/share/apps/lua/access_check.lua:133: bad argument #1 to 'decode' (string expected, got userdata)
该段代码的主要作用是在openresty中lua读取redis中数据并解码为json:
12345678local access_token = redis_client:read_by_key(token_key) if access_token == nil then return false end local obj_token = cjson.decode(access_token) -- do something
通过查询资料得知原因:lua读取redis数据返 ...
In place iterative policy evaluation
<p>Iterative Policy Evaluation的迭代过程一般有两种方式:</p>
使用两个数组,其中一个数组存储上一轮迭代的状态价值,另外一个数组存储本轮迭代中的状态价值,本轮迭代总是从上一轮迭代(老的)的状态价值取值,这样在迭代过程中老的状态价值不会受到影响。
使用一个数组来存储状态价值,并在迭代时实时更新状态价值,这样在迭代过程中能够更早的利用新的状态价值,此种更新状态价值的方法称为“in place iterative policy evaluation”。
下面是两种不同的实现思路运行结果的对比图:
尽管使用两个数组的迭代方法思路更清晰,但是in place iterative policy evaluation的收敛速度更快,因此在实际运用中,往往使用in place iterative policy evaluation。
详细的实现代码参见:grid world源码
</article>
十七、考虑使用Lazy evaluation(缓式评估)
从效率上看,最好的运算是从未执行过的运算。
拖延战术——缓式评估
在真正需要之前,不必急着为某物做一个副本,取而代之的是以拖延战术的方式——只要能够,就是使用其它副本
二、区分读和写
运用lazy evaluation和proxy classes(条款30),可以延迟决定读还是写
三、Lazy Fetching(缓式取出)
当程序使用大型对象,内含许多字段。
在产生对象时,只产生一个该对象的外壳,不从磁盘读取数据。当对象内的某个字段被需要了,才取回对应数据。
mutable的意思是这个属性的变量可以在任何member function内被修改,即使是const member function内产生一个pointer-to-non-const指向this所指对象,当需要修改某个data member时,通过这个冒牌的this指针来修改,可以在const member function内部利用const_cast将* this的常量性滤掉,如果编译器不支持const_cast就用C语法的类型转换。
四、Lazy Expression Evaluation(表达式缓式评估)五、摘要
...
Lua Module 实践 · Pan's paper
最近用openresty写接口,每个接口都要要链接数据库,写一个通用的模块来实现,顺便学习下lua module的相关知识。
lua 模块Lua中的一个模块就是一个table,table元素包括变量,函数等。“因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table”。
123456789101112131415161718192021-- 定义一个名为 module 的模块module = {}-- 定义一个常量module.constant = "这是一个常量"-- 定义一个函数function () io.write("这是一个公有函数!n")endlocal function func2() print("这是一个私有函数!")endfunction module.func3() func2()endreturn module
require函数require函数用来加载模块。
123require("<模块名>")-- 或requ ...
Lua元表
javascript语言本身不支持面向对象,ES2015中增加了class关键字,却不过是prototype语法糖而已,本质上prototype形式的面向对象只能算是一种“模拟”,这其中很重要的原因之一是js从来没有一套完美的深拷贝方案,子类只能借助原型链获取父类方法的引用,这不能算是严格意义的继承,当然也就算不上面向对象。
和js一样,lua的面向对象需要通过table来模拟,有些行为很像js中的原型,比如下面的例子。
1234567891011121314Animal = {name = "Animal"}Animal.__index= Animalfunction () local re = {} setmetatable(re, self) return reendfunction Animal:GetName() return self.nameendx = Animal:new()
在lua中,元表是个很有意思的存在。上面Animal是实例出的对象x的元表,元表在某种意义上相当于js中的构造函数,而__index则类似prototype(这里__in ...
优化wireshark下Lua插件SMGP协议代码
@(Linux)[学习]
[toc]
写在前面由于wireshark对SMGP协议不支持,之前使用wireshark查看SMGP协议字段,一般都是拷贝下来HEX,一个字节一个字节对。眼睛都要花了!昨天检查问题的时候同事和我说wireshark可以支持Lua插件自己编写协议识别代码,然后给了我一个SMGP.Lua文件。我安装了一下,发现是可以识别,但是如果一个包里有多个协议包的时候只识别一个,于是决定优化一下
2016-12-29修改有时候包经过跳转,则端口不是标准的8890了,则可以在后面添加一行代码:12tcp_table:add(8890,p_SMGP)tcp_table:add(38080,p_SMGP)
这样就可以识别8890和38080了。想要识别什么就添加什么。很方便
前期准备Lua方面首先,我对Lua语言之前没有接触过,不过语言大都差不多。而且我的修改比较简单,应该就是加一个控制循环语句和判断。先去看了一下Lua一些基本语法.lua的循环和shell差不多123while a do passend
sireshark方面根据官方给的实例,搞懂基本流程https://www ...
Lua表达式 · 花生肉泥
算术运算符下表列出了lua语言中常用算术运算符(设定A的值为10,B的值为20)
操作符
描述
示例
+
加法
A + B 输出 30
-
减法
A - B 输出 -10
*
乘法
A * B 输出 200
/
除法
B / A 输出 2
%
取余
B % A 输出 0
^
乘幂
A ^ 2 输出 100
-
负号
-A 输出 -10
关系运算符lua中的关系运算符有:123456< ><= >= == ~=
这些操作符返回结果为false或者true
==和~=比较两个值,如果两个值类型不同,lua认为两者不同;nil只和自己相等。lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一对象时相等。1234local a,b = 11,"33"print(a==b) print(a~=b) -- falseprint(a>=b) -- trye
A=10 B=20
操作符
描述
示例
== ...