Lua
网上教程
使用 tasklist /fi "imagename eq nginx.exe"
命令查看 nginx 进程,其中一个是 master 进程,另一个是 worker 进程
cmd进入nginx的安装目录,输入start nginx.exe
来启动nginx
cmd进入nginx的安装目录,输入nginx -s reload
来重启nginx
LuaJIT部分语法
环境搭建
1 | wget http://luajit.org/download/LuaJIT-2.1.0-beta1.tar.gz |
基础数据类型
nil
无效值
boolean
false
和nil
为假,其余包括0全部为真。
number
实数类型,可以用math.floor
向下取整和math.cell
向上取整。
string
'abc'
,"abc"
,[=[abc\n]=]
(不转义)
字符串不可改变,只能新建,相同字符串在内存中只有一个副本
table
1 | local corp = { |
function
1 | function foo() |
表达式
a and b
如果a
为nil,则返回a,否则返回ba or b
如果a
为nil,则返回b,否则返回anot a
返回true or false
字符串拼接
1 | print("Hello " .. "World") -->打印 Hello World |
字符串拼接会不断的创建新字符串,若在循环中进行拼接,则对性能有较大影响,推荐使用table.concat()
1 | local pieces = {} |
控制语句
if
1 | x = 10 |
if-else
1 | x = 10 |
if-elseif-else
1 | score = 90 |
嵌套if
1 | score = 0 |
while
有break
,无continue
1 | while 表达式 do |
repeat
一直执行,直到条件
为真
1 | repeat |
for
数字 for(numeric for)
1 | for var = begin, finish, step do |
- var从begin取到finish,左右都为闭区间
- begin、finish、step 三个表达式只会在循环开始时执行一次
- 第三个表达式 step 是可选的,默认为 1
- 控制变量 var 的作用域仅在 for 循环内,需要在外面控制,则需将值赋给一个新的变量
范型 for(generic for)
泛型 for 循环通过一个迭代器(iterator)函数来遍历所有值:
1 | -- 打印数组a的所有值 |
函数
1 | function function_name (arc) -- arc 表示参数列表,函数的参数列表可以为空 |
Lua函数的参数大部分是按值传递的,只有传入一个表table时,会进行引用传递。
参数补齐
1 | local function fun1(a, b) --两个形参,多余的实参被忽略掉 |
变长参数
1 | local function func( ... ) -- 形参为 ... ,表示函数采用变长参数 |
返回值
1 | local function init() -- init 函数 返回两个值 1 和 "lua" |
全动态函数调用
1 | local function run(x, y) |
模块
my.lua
1 | local foo={} |
main.lua
1 | local fp = require("my") |
String库
string.byte
返回ASCII码
用该函数来进行字符串相关的扫描和分析是最为高效的
1 | print(string.byte("abc", 1, 3)) |
string.char (…)
接收 0 个或更多的整数(整数范围:0~255),返回这些整数所对应的 ASCII 码字符组成的字符串。当参数为空时,默认是一个 0。
1 | print(string.char(96, 97, 98)) |
string.upper(s)
接收一个字符串 s,返回一个把所有小写字母变成大写字母的字符串。
1 | print(string.upper("Hello Lua")) -->output HELLO LUA |
string.lower(s)
接收一个字符串 s,返回一个把所有大写字母变成小写字母的字符串。
1 | print(string.lower("Hello Lua")) -->output hello lua |
string.len(s)
接收一个字符串,返回它的长度。不推荐使用,推荐使用#s
的方式获取字符串长度
1 | print(string.len("hello lua")) -->output 9 |
string.find(s, p [, init [, plain]])
在 s 字符串中第一次匹配 p 字符串。若匹配成功,则返回 p 字符串在 s 字符串中出现的开始位置和结束位置;若匹配失败,则返回 nil。 第三个参数 init 默认为 1,并且可以为负整数,当 init 为负数时,表示从 s 字符串的 string.len(s) + init 索引处开始向后匹配字符串 p 。 第四个参数默认为 false,当其为 true 时,只会把 p 看成一个字符串对待。
1 | local find = string.find |
string.format(formatstring, …)
按照格式化参数 formatstring,返回后面 … 内容的格式化版本。编写格式化字符串的规则与标准 c 语言中 printf 函数的规则基本相同:它由常规文本和指示组成,这些指示控制了每个参数应放到格式化结果的什么位置,及如何放入它们。一个指示由字符 % 加上一个字母组成,这些字母指定了如何格式化参数,例如 d 用于十进制数、x 用于十六进制数、o 用于八进制数、f 用于浮点数、s 用于字符串等。在字符 % 和字母之间可以再指定一些其他选项,用于控制格式的细节。
1 | print(string.format("%.4f", 3.1415926)) -- 保留4位小数 |
string.match(s, p , init)
在字符串 s 中匹配(模式)字符串 p,若匹配成功,则返回目标字符串中与模式匹配的子串;否则返回 nil。第三个参数 init 默认为 1,并且可以为负整数,当 init 为负数时,表示从 s 字符串的 string.len(s) + init 索引处开始向后匹配字符串 p。尽量用ngx.re.match
替代。
1 | print(string.match("hello lua", "lua")) |
string.gmatch(s, p)
返回一个迭代器函数,通过这个迭代器函数可以遍历到在字符串 s 中出现模式串 p 的所有地方。尽量用ngx.re.gmatch
替代。
1 | s = "hello world from Lua" |
string.rep(s, n)
返回字符串 s 的 n 次拷贝。
1 | print(string.rep("abc", 3)) --拷贝3次"abc" |
string.sub(s, i [, j])
返回字符串 s 中,索引 i 到索引 j 之间的子字符串。当 j 缺省时,默认为 -1,也就是字符串 s 的最后位置。i 可以为负数。当索引 i 在字符串 s 的位置在索引 j 的后面时,将返回一个空字符串。
1 | print(string.sub("Hello Lua", 4, 7)) |
string.gsub(s, p, r [, n])
将目标字符串 s 中所有的子串 p 替换成字符串 r。可选参数 n,表示限制替换次数。返回值有两个,第一个是被替换后的字符串,第二个是替换了多少次。用ngx.re.gsub
替换。
1 | print(string.gsub("Lua Lua Lua", "Lua", "hello")) |
string.reverse (s)
接收一个字符串 s,返回这个字符串的反转。
Table库
下标从 1 开始
不要在 Lua 的 table 中使用 nil 值,如果一个元素要删除,直接 remove,不要用 nil 去代替。
table.concat (table [, sep [, i [, j ] ] ])
对于元素是 string 或者 number 类型的表 table,返回 table[i]..sep..table[i+1] ··· sep..table[j] 连接成的字符串。填充字符串 sep 默认为空白字符串。起始索引位置 i 默认为 1,结束索引位置 j 默认是 table 的长度。如果 i 大于 j,返回一个空字符串。
1 | local a = {1, 3, 5, "hello" } |
table.insert (table, [pos ,] value)
在(数组型)表 table 的 pos 索引位置插入 value,其它元素向后移动到空的地方。pos 的默认值是表的长度加一,即默认是插在表的最后。
table.remove (table [, pos])
在表 table 中删除索引为 pos(pos 只能是 number 型)的元素,并返回这个被删除的元素,它后面所有元素的索引值都会减一。pos 的默认值是表的长度,即默认是删除表的最后一个元素。
table.sort (table [, comp])
按照给定的比较函数 comp 给表 table 排序,也就是从 table[1] 到 table[n],这里 n 表示 table 的长度。 比较函数有两个参数,如果希望第一个参数排在第二个的前面,就应该返回 true,否则返回 false。 如果比较函数 comp 没有给出,默认从小到大排序。
1 | local function compare(x, y) --从大到小排序 |