Lua学习点滴记录

阅读更多
1、Lua官网
http://www.lua.org/manual/5.3/manual.html

2、Lua与Java的比较
Lua学习点滴记录_第1张图片

3、Lua与LuaJIT比对
http://luajit.org/performance_x86.html

4、Lua语法实战
【syntax】
0> 在 Lua 中,一共只有 9 种数据类型,分别为 nil 、boolean 、lightuserdata 、number 、string 、 table 、 function 、 userdata 和 thread。
  =>其中,只有 string table function thread 四种在 vm 中以引用方式共享,是需要被 GC 管理回收的对象。其它类型都以值形式存在。
0> lua中 nil和false返回值都是假。
1> 【..】表示连接字符串
=>不能连接nil值,attempt to concatenate local 'http_uri_arg_value' (a nil value)=>error
2> lua函数可以返回多个变量
3> 【local】标识局部变量
4> 通过nginx变量取uri,但获取不到参数,如下:
-- 请求中的当前URI(不带请求参数,参数位于$args)
local uri = ngx.var.uri
5> 获取uri中的指定参数
local user = ngx.var.arg_user -- 定义user变量并获取url中的参数 http://localhost?user=hello
6> 跳转
return responses.send(status_code, message)
7> ngx.print vs ngx.say => say会多输出一空行
8> false和nil为假, true和 not nil为真, 0 也为真!
9> lua标识空采用nil
10> elseif,区别于 else if;
11> and & or,不支持问号表达式;lua中0表示true;
12> no continue,lua 中不支持 continue 语法;需要用 if 和 else 语句实现;
13> . & :,lua 中 object.method 和 object:method 行为不同,object:method 为语法糖,会扩展成第一个参数为 self
14> forgot return _M,在编写模块的时候如果最后忘记 return _M, 调用时会提示尝试对 string 调用方法的异常
15> 事实上,一个lua_State也是一个类型为 thread 的 GCObject 。
16> mainthread 一定是 GCObject 链表上的最后一个节点(除 Udata 外),这是因为挂接过程都是向链表头添加的。
17> 一个完整的 lua 虚拟机在运行时,可有多个lua_State,即多个 thread 。它们会共享一些数据。这些数据放在global_State *l_G域中。其中自然也包括所有 GCobject 的链表。
18> 线程(thread)作为Lua中一种基本的数据类型,它代表独立的执行线程(independent threads of execution),
   线程类型是实现协程(coroutines)的基础,注意这里的线程类型不要与操作系统线程混淆,Lua的线程类型是Lua虚拟机实现一种数据类型。
19> Lua线程状态
//////////begin////////
44 /* thread status */
45 #define LUA_OK      0
46 #define LUA_YIELD   1
47 #define LUA_ERRRUN  2
48 #define LUA_ERRSYNTAX   3
49 #define LUA_ERRMEM  4
50 #define LUA_ERRGCMM 5
51 #define LUA_ERRERR  6
///////////end//////////
20> 在调用lua_newstate     初始化Lua虚拟机时,会创建一个全局状态和一个线程(或称为调用栈),这个全局状态在整个虚拟机中是唯一的,供其他线程共享。
    一个Lua虚拟机中可以包括多个线程,这些线程共享一个全局状态,线程之间也可以调用lua_xmove函数来交换数据。
21> luaV_execute 是Lua VM 执行一段字节码的入口。Lua VM 就是一个状态机,从当前调用栈上次运行点开始解释字节码指令,
    直到下一个 C 边界跳出点(可以是函数执行完毕,也可以是一次协程 yield 操作)
22> 所有的指令都会操作寄存器 A ,从 Lua VM 的角度看,寄存器就是数据栈上的变量,所以可以将寄存器 A 所指变量预先取出放到局部变量ra 中。
    ra = RA(i)。某些指令操作在 vm 运行过程中会改变数据栈的大小(伸缩),而 ra 是一个指向数据栈的指针,而不是一个索引。这种情况下,一旦数据栈发生变化,就需要重新获取ra的值。
23> ngx_lua模块的原理:
=>1、每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;
=>2、将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;
=>3、每个外部请求都由一个Lua协程处理,协程之间数据隔离;
=>4、Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;
=>5、I/O等异步操作完成时还原相关协程上下文数据,并继续运行;

24> Table
=>table 库是由一些辅助函数构成的,这些函数将 table 作为数组来操作
=>在初始化一个数组的时候,若不显式地用键值对方式赋值,则会默认用数字作为下标,从 1 开始。
  由于在 Lua 内部实际采用哈希表和数组分别保存键值对、普通值,所以不推荐混合使用这两种赋值方式。
=>任何一个nil值都有可能被当成数组的结束,这也就说明对于有“空洞”的情况,table 的长度存在一定的不可确定性。
=>不要在 Lua 的 table 中使用 nil 值,如果一个元素要删除,直接 remove,不要用 nil 去代替。
=>table.maxn (table),该函数的开销相比 # 运算符也会更大一些。
=>问题:用哈希表存储键值对时,可以取到key的顺序位置?比如第1个参数,第2个参数,……
=>获取url参数 ngx.var.arg_xx与ngx.req.get_uri_args["xx"]两者都是为了获取请求uri中的参数
///////begin//////
local strider = ngx.var.arg_strider
local strider = ngx.req.get_uri_args["strider"]
////////////end///////////
=>URI 内容传递过程中是需要调用 ngx.encode_args 进行规则转义

26> String
=>使用 string.byte 来进行字符串相关的扫描和分析是最为高效的
=>应当总是使用 # 运算符来获取 Lua 字符串的长度
=>对于 LuaJIT 这里有个性能优化点,对于 string.find 方法,当只有字符串查找匹配时,是可以被 JIT 编译器优化的
=>print(find("abc cba", "(%a+)", 1, true))
>>>>string.reverse (s)
>>>>string.find(s, p [, init [, plain]])=>find("abc cba", "(%a+)", 1, true) =>第4个参数默认是false,建议仅匹配字符串,设置为true
=>string.find (s, pattern [, init [, plain]]) =>_, q=string.find("haha", 'ah')=>通过虚拟变量替代不需要的返回值
=>strig.sub(a,1,3) In particular, the call string.sub(s,1,j) returns a prefix of s with length j, and string.sub(s, -i) (for a positive i) returns a suffix of s with length i

27> 判断字符串长度
//////////begin/////////
if conf.whitelist and #conf.whitelist > 0 then
    block = not iputils.binip_in_cidrs(binary_remote_addr, cidr_cache(conf.whitelist))
  end
/////////end///////////

28> 特殊字符【_】标识虚变量dummy variable,
=> 虚变量不仅仅可以被用在返回值,还可以用在迭代等
=> 当有多个返回值需要忽略时,可以重复使用同一个虚变量
for example:用于ipairs
////////////begin/////////
for _, location in ipairs {"body", "headers", "querystring"} do
   plugin.config[action][location] = plugin.config[action][location] or {}
end
/////////end///////////
  • Lua学习点滴记录_第2张图片
  • 大小: 86.6 KB
  • 查看图片附件

你可能感兴趣的:(Lua,LuaJIT)