不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2019-03-31 00:32  分类:OpenResty_Lua  编辑

大家在使用 Lua 的时候,一定会遇到不少和 nil 有关的坑吧。有时候不小心引用了一个没有赋值的变量,这时它的值默认为 nil。如果对一个 nil 进行索引的话,会导致异常。

作者:php-note.com  发布于:2019-03-31 00:29  分类:OpenResty_Lua  编辑

table.getn(t) 等价于 #t,但计算的是数组元素,不包括 hash 键值。而且数组是以第一个 nil 元素来判断数组结束。# 只计算 array 的元素个数,它实际上调用了对象的 metatable 的 __len 函数。对于有 __len 方法的函数返回函数返回值,不然就返回数组成员数目。

作者:php-note.com  发布于:2019-03-31 00:22  分类:OpenResty_Lua  编辑

Lua 的设计有一点很奇怪,在一个 block 中的变量,如果之前没有定义过,那么认为它是一个全局变量,而不是这个 block 的局部变量。这一点和别的语言不同。容易造成不小心覆盖了全局同名变量的错误。

作者:php-note.com  发布于:2019-03-31 00:13  分类:OpenResty_Lua  编辑

在 Lua 中,我们可以使用表和函数实现面向对象。将函数和相关的数据放置于同一个表中就形成了一个对象。

作者:php-note.com  发布于:2019-03-31 00:10  分类:OpenResty_Lua  编辑

在 Lua 5.1 语言中,元表 (metatable) 的表现行为类似于 C++ 语言中的操作符重载,例如我们可以重载 "__add" 元方法 (metamethod),来计算两个 Lua 数组的并集;或者重载 "__index" 方法,来定义我们自己的 Hash 函数。Lua 提供了两个十分重要的用来处理元表的方法,如下:

  • setmetatable(table, metatable):此方法用于为一个表设置元表。
  • getmetatable(table):此方法用于获取表的元表对象。
作者:php-note.com  发布于:2019-03-31 00:03  分类:OpenResty_Lua  编辑

Lua I/O 库提供两种不同的方式处理文件:隐式文件描述,显式文件描述。

这些文件 I/O 操作,在 OpenResty 的上下文中对事件循环是会产生阻塞效应。OpenResty 比较擅长的是高并发网络处理,在这个环境中,任何文件的操作,都将阻塞其他并行执行的请求。实际中的应用,在 OpenResty 项目中应尽可能让网络处理部分、文件 I/0 操作部分相互独立,不要揉和在一起。

作者:php-note.com  发布于:2019-03-30 23:49  分类:OpenResty_Lua  编辑

Lua 数学库由一组标准的数学函数构成。数学库的引入丰富了 Lua 编程语言的功能,同时也方便了程序的编写。常用数学函数见下表:

作者:php-note.com  发布于:2019-03-30 23:30  分类:OpenResty_Lua  编辑

在 Lua 中,函数 time、date 和 difftime 提供了所有的日期和时间功能。

在 OpenResty 的世界里,不推荐使用这里的标准时间函数,因为这些函数通常会引发不止一个昂贵的系统调用,同时无法为 LuaJIT JIT 编译,对性能造成较大影响。推荐使用 ngx_lua 模块提供的带缓存的时间接口,如 ngx.today, ngx.time, ngx.utctime, ngx.localtime, ngx.now, ngx.http_time,以及 ngx.cookie_time 等。

作者:php-note.com  发布于:2019-03-30 23:25  分类:OpenResty_Lua  编辑

table 库是由一些辅助函数构成的,这些函数将 table 作为数组来操作。

作者:php-note.com  发布于:2019-03-30 23:18  分类:OpenResty_Lua  编辑

Lua 字符串库包含很多强大的字符操作函数。字符串库中的所有函数都导出在模块 string 中。在 Lua 5.1 中,它还将这些函数导出作为 string 类型的方法。这样假设要返回一个字符串转的大写形式,可以写成 ans = string.upper(s) , 也能写成 ans = s:upper()。为了避免与之前版本不兼容,此处使用前者。