Lua table、模块与面向对象
很久之前接触过lua,最近在工作中又用到了一些,对lua这门语言又有了新的认识和理解。Lua是一门很简洁高效的语言,在openresty项目中大量使用,游戏开发中也使用lua来写一些脚本。在这里记录一下自己对lua中面向对象的理解。
table在lua中是一种kv的数据结构,也指由一些辅助函数组成的库。如:
local tb = {name="zhangsan", age=23} --此时变量tb为是一个table的数据结构
table.getn(tb) --此时便是调用了table库里的getn函数,获取tb的长度。
在lua中table数组的下标索引通常从1开始计数,因为这表示的是位置,而在c/c++中数组从0开始,表示的是偏移量。在初始化一个table数组时,若不显示的使用键值对赋值,则默认会用数字作为下标,从1开始。栗子:
local person = {name="zhangsan", 23, phone=138138138, addr="beijing"}
print(person[ ...
OpenWRT路由器设置界面中的Lua填坑
刚结束一个急活,主要是整理某个 OpenWRT 路由的设置界面,网页服务主要用的是 Nginx,网页用的是 BackBone 和 jQuery 配合,后端设置服务主要用的是 Lua(由 Nginx 代理)调用 OpenWRT 的 UCI 和 ubus。一开始我以为只需要前端稍微调整下就行了,后来发现后边跟着的 Lua 得一起整,顺带补了不少 OpenWRT 的基础知识,下边简单梳(还)理(债)……
UCI
基础知识
UCI 是“Unified Configuration Interface”(统一配置界面)的缩写,是 OpenWrt 系统的核心配置框架,它的主要作用是整合系统里不同的设置项,并提供一个统一的接口。OpenWrt 系统配置文件默认被集中放在了 /etc/ ...
Lua的and与or
很早就知道lua的and与or的巧妙用法:
local str = num==1 and "one" or "not one"
这句话可以简洁的表达如下意思:
local str = ""
if num==1 then
str = "one"
else
str = "not one"
end
类似与c++的:?运算符,一直用着没啥问题,可是前不久遇到了一个很奇怪的bug,查到最后,锁定在这个用法上,举例:
function get_item(config_id, star_lv, server_id)
for _,item in pairs(items) do
if item.config_id==config_id and item.star_lv==star_lv and (server_id and item.server_id==server_id or true) then
return item
end
end
end
我是想:根据con ...
给 Tengine 加上 lua 拓展
Tengine 能动态加载第三方模块,成为我们青睐的选择,我们可以编译动态链接文件,而不需要重新安装 Nginx, 这对在线增强 webservice 很有帮助.感谢 agentzh, lua-nginx-module, 可以让我们使用 lua 增强nginx的功能, 不言而喻,我们必须现有 Lua 的环境,才能运行 ngx_lua;
编译 nginx_lua官方推荐使用LuaJit,虽然也可以使用Lua,但是即时编译(Just-In-Time Compiler)混合了动态编译和静态编译,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。
下载安装
12345wget http://luajit.org/download/LuaJIT-2.0.4.tar.gztar zxvf LuaJIT-2.0.4.tar.gzcd LuaJIT-2.0.4makemake install
设置环境变量
12export LUAJIT_LIB=/usr/local/libexport LUAJIT_INC=/usr/local/include/luajit-2.0
然后编译n ...
evaluate(input_sentence)
详细的记录 evaluate函数的实现。解决报错
12345678910111213141516171819ValueError Traceback (most recent call last)<ipython-input-44-2ec1176683f0> in <module>----> 1 translate(u'Estoy trabajando.')<ipython-input-43-4364cc5c7981> in translate(input_sentence) 49 50 def translate(input_sentence):---> 51 results, input_sentence, attention_matrix = evaluate(input_sentence) 52 53 print("Input: %s" % (input_sentence))<ip ...
Lua string 哈希碰撞
Lua 中 40 字节以下的字符串会被内部化到一张表中(Lua 5.3),这张表挂在 global state 结构下。对于短字符串,相同的串在同一虚拟机上只会存在一份,这被称为字符串的内部化。
其实字符串在 Lua VM 中是以两种内部形式保存的:短字符串及长字符串。其界限默认设置为40(字节)
对于比较长的字符串(32字节以上),为了加快哈希过程,计算字符串哈希值是跳跃进行的(并没有 hash 全部的位)。
Lua Wiki 上列出了各个版本的 Lua 对于 string 没有计算 hash 的长度:
Hash algorithm analysis
-- number of bytes not used in hash function
==============================================================
String length < 15, 15-20 , 20-32 , 32-64
-------------------------------------------- ...
lua gc分析
说明分析lua使用的gc算法,如何做到分步gc,以及测试结论
gc算法分析lua gc采用的是标记-清除算法,即一次gc分两步:
从根节点开始遍历gc对象,如果可达,则标记
遍历所有的gc对象,清除没有被标记的对象
二色标记法lua 5.1之前采用的算法,二色回收法是最简单的标记-清除算法,缺点是gc的时候不能被打断,所以会严重卡住主线程
三色标记法
lua5.1开始采用了一种三色回收的算法
白色:在gc开始阶段,所有对象颜色都为白色,如果遍历了一遍之后,对象还是白色的将被清除
灰色:灰色用在分步遍历阶段,如果一直有对象为灰色,则遍历将不会停止
黑色:确实被引用的对象,将不会被清除,gc完成之后会重置为白色
luajit使用状态机来执行gc算法,共有6中状态:
GCSpause:gc开始阶段,初始化一些属性,将一些跟节点(主线程对象,主线程环境对象,全局对象等)push到灰色链表中
GCSpropagate:分步进行扫描,每次从灰色链表pop一个对象,遍历该对象的子对象,例如如果该对象为table,并且value没有设置为week,则会遍历table所有table可达的val ...
PIL.9Lua中的闭包
Lua中的函数是 第一类的值加上合适的词法域。那么,函数是第一类值意味着什么呢?这是说,在Lua中,一个函数,就是一个和 数字或字符串一样具有某些权限的值。一个程序可以把函数存储在变量中(全局或者局部都可以)和表中,把函数作为参数传递给其他函数,或者以函数作为值返回。
函数具有词法域又是什么意思呢?就是说函数可以访问他们包裹函数的变量。
这两个特性给了Lua巨大的弹性;具体点说,一个程序在运行一段不受信任的代码时(比如从网络上收到的代码)可以重新定义一个函数来增加功能或者擦除一个函数来创建一个安全的环境。更重要的是,这些特性运行我们从函数语言的世界应用很多强大的编程技术到Lua。即使你对函数式编程没有什么兴趣,但是看一下这些技术是非常有价值的,这会让你的程序更小更简单。
下面的例子说明了函数作为第一类值的情况:
a = {p = print} a.p("hello world") -- hello worldprint = math.sin -- 'print' now refers to the sine functiona.p(print(1)) ...
lua学习笔记
使用命令行参数-i来启动lua解释器,那么解释器就会在运行完指定的程序块后进入交互模式。
12345test.luafunction ( ... ) print("foo")end
1234lua -i test.luaLua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio foo()foo
另一种运行程序块的方式是使用函数dofile,该函数会立即执行一个文件。
行注释
1-- here
块注释
1234--[[herehere--]]
类型与值在lua中有8种基础类型:nil,boolean,number,string,userdata,function,thread,table
函数type可根据一个值返回其类型名称:
1print(type(type)) -- function
lua将值false和nil视为“假”,而除此之外的其他值视为“真”。
lua提供运行时的数字与字符串的自动转换。在一个字符串上应用算数操作时,lua会尝试将这个字符串转换成一个数字:
1print("10" + 1) ...
C++与Lua初探
最近在工作中用到了Lua与C++的相互调用的知识,现在对两者的互相调用进行总结。
我觉得要了解两者之间的调用关系,需要弄清三件事情:
lua栈是什么
C++如何调用lua
lua如何调用C++
在弄清这三件事情之前,让我们先来看看怎么讲Lua嵌入到C++程序中。
大致思路就是将Lua的源码打包成静态库,在程序编译的时候,将静态库也加入到编译选项中。
具体步骤如下:
去官网上下载Lua源码
在根目录下运行 make linux(由于我是在linux平台下编译的,所以make后面跟的是linux,直接运行make会有相关的提示)
运行之后会在 src 目录下,生成一个liblua.a的静态库,这个静态库是我们所需要的
在编译程序的时候加入这个静态库,同时可能还需要指定下C++源码中引用到lua的头文件路径,我在编译的过程中,发现lua的静态库还需要 libm.so 和 libdl.so 动态库,所以也需要指定下
Lua栈
Lua栈是C++和Lua交流的唯一途径,所有的信息交流都是通过这个栈来完成。所以在介绍两者具体的调用之前,非常有必要介绍一下这个栈。
...