近期项目需要,研究openresty,开始学习Lua,对Lua常用的语法进行一个简单总结
数据类型
空类型
nil
所有未赋值的变量都为nil
布尔类型
true/false
nil和false均为false,其它值为true。这点与C/C++不同,C/C++中的0也是false
数值类型
所有的整数和浮点数都为数值类型
字符串(string)
可以使用双引号,单引号或[[]]来定义字符串,字符串拼接使用..,如:
local a = "aaa"
local b = 'bbb'
local c = [["aaa",'bb']]
print(a)
print(b)
print(c)
print(a.."~="..b)
运行结果
D:\My Work\lua>lua53 string.lua
aaa
bbb
"aaa",'bb'
aaa~=bbb
D:\My Work\lua>
表(table)
lua的表分为两种,一种为数组,一种为映射,对表中的类型,不要求一致
<pre name="code" class="plain">
--数组:
ta = {1, 2, "Hello"}
--映射:
tb = {
["Hello"] = "world",
[1] = "Hello"
}
print("数组")
for k, v in ipairs(ta) do
print(k, v)
end
print("映射")
for k, v in pairs(tb) do
print(k, v)
end
运行结果
D:\My Work\lua>lua53 string.lua
数组
1 1
2 2
3 Hello
映射
1 Hello
Hello world
D:\My Work\lua>
与C/C++/java不同,Lua的数组是从1开始索引的,映射则是按照Hash进行索引
函数
函数有两种定义方式,第二种方式有点像Python的Lamda
function foo(a, b)
表达式
end
foo = function(a, b)
表达式
end
变量
Lua是弱类型语言,变量不需要声明类型的,但赋值后可以使用type查看变量的类型,变量可以赋值为上面类型中的任意类型
a = 1
b = 1.1
c = "test"
foo = function(c)
print("Hello "..c)
end
print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(foo))
运行结果
D:\My Work\lua>lua53 string.lua
number
number
string
nil
function
D:\My Work\lua>
变量默认为全局,如果要将变量定为局部变量,需要在变量前加上local。加上local的好处,Lua解释器在执行时会对local变量进行优化
function fa()
a = 10
print("in fa a is "..a)
end
function fb()
local b = 11
print("in fb b is "..b)
end
fa()
fb()
print("outside a is "..a)
print("outside b is "..b)
运行结果
D:\My Work\lua>lua53 string.lua
in fa a is 10
in fb b is 11
outside a is 10
lua53: string.lua:14: attempt to concatenate a nil value (global 'b')
stack traceback:
string.lua:14: in main chunk
[C]: in ?
D:\My Work\lua>
以上可见,被local修斯的b在外面就是一个nil
table和string类型处理
对table和string,lua提供了一些操作函数,使用下面代码可以查看,具体参数可以自行baidu
print("table内置函数")
for k, v in pairs(table) do
print(k, v)
end
print("string内置函数")
for k, v in pairs(string) do
print(k, v)
end
运行结果
D:\My Work\lua>lua53 string.lua
table内置函数
remove function: 62995270
pack function: 629945c0
unpack function: 62995120
insert function: 62994f90
concat function: 62994df0
move function: 62994330
sort function: 62995430
string内置函数
upper function: 6299d440
dump function: 6299f3c0
gmatch function: 6299db30
rep function: 6299d560
lower function: 6299d730
gsub function: 6299fd00
find function: 6299fcf0
unpack function: 6299e880
byte function: 6299cf90
packsize function: 6299e750
char function: 6299dbc0
pack function: 6299ebd0
sub function: 6299d280
reverse function: 6299d4d0
match function: 6299fce0
len function: 6299cde0
format function: 6299dcf0
D:\My Work\lua>
控制语句
if语句
if 条件 then
表达式
elseif 条件 then
表达式
else
表达式
end
while语句
while 条件 do
表达式
end
for语句1
for语句1类似于C/C++中的for
for i=起始, 结束[, 步进] do
表达式
end
起始为i的初值,结束为i的结束值,步进为i每次增加值,不填默认每次加1,填写i则按步进数增长,如果从后往前轮询,只需把步进设置为负数
注意,这里的起始和结束值都会执行,直到i大于结束或小于结束才会退出
for语句2
for语句2类似于python中的for
for k, v in pairs(table变量) do
表达式
end
一些内建函数
a="hello world"
print(#a)
b = {1, 2, 3}
print(#b)
运行结果
D:\My Work\lua>lua53 string.lua
11
3
D:\My Work\lua>
以上为Lua常用的基本语法,Lua另外还可以与C函数互相调用,下面会进行研究
对Lua深入学习,可参考:
http://www.lua.org/pil/contents.html
http://moonbingbing.gitbooks.io/openresty-best-practices/content/index.html