lua是一门动态类型语言。这意味着变量没有类型,只有值才有类型。语言中不设类型定义,所有的值携带自己的类型。在lua中,除了关键字,一切都是变量。
注释
单行注释:连续两个减号‘--
’
多行注释:由‘--[[
’开始,‘]]
’结束
关键字
and break do else elseif end false for function if in
local nil not or repeat return then true until while
变量
lua支持的变量类型
Nil 空值,所有没有用过的变量都是nil,nil即是值也是类型
Boolean true或者false
Number 相当于c的double
String 可以包含也可以不包含‘\0'
Table 关系表类型
Function 函数类型
Userdata 专门用来和lua的宿主程序打交道,常用的是struct或指针
Thread 线程类型
在lua中不管在什么地方使用变量,都不需要声明,并且所有的变量默认都是全局变量,除非显示指定local关键字。
String
以下表示的是完全相同的字符串:
a = 'alo\n123"'
a = "alo\n123\""
a = '\97lo\10\04923"'
a = [[alo
123"]]
a = [==[
alo
123"]==]
Table
关系表类型是一个很强大的类型,你可以把它看成是一个数组,不过不同于c数组只能用正整数来作索引,lua中可以用任意类型作为Table的索引,除了nil。另外,不同于c数组内容只允许一种类型,lua中允许任意类型作为Table内容,除了nil。
T["John"] = {Age=27, Gender="Male"} 等价于
T["John"] = {}
T["John"]["Age"] = 27
T["John"]["Gender"] = "Male"
当表的索引是字符串的时候,可以简写为
T.John={}
T.John.Age = 27
T.John.Gender = "Male"
或者
T.John{Age=27, Gender="Male"}
复杂一点的Table:
T = {
10, --相当于[1] = 10
[100] = 40,
John = {
Age = 27,
Gender = Male
},
20 --相当于[2] = 20
}
Function
定义简单:
function add(a, b)
return a+b
end
等价于
add = function(a, b) return a+b end
可以返回多个结果:
function s()
return 1,2,3,4
end
a,b,c,d = s() --此时,a=1,b=2,c=3,d=4
lua编程
lua语句可以用分号’:
‘隔开,也可以用空白隔开
if
if condition then
...
elseif condition then
...
else
...
end
例如
if 1+1~=2 then
print("true")
elseif 1+2~=3 then
print("true")
else
print("false")
end
while
while condition
do
...
end
repeat
repeat
...
until condition
for
for var=init, end, step
do
...
end
for var1, var2, ..., varn in tables
do
...
end
例如
for i=1, 10, 2
do
print(i);
end
for a, b in list
do
print(a, b)
end
步进step省略时,使用默认值1。break
可以用来终止当前循环。
与c的不同
语句块
c中使用’{‘和’}’括起来,在lua中使用do
和end
括起来。
赋值语句
lua中赋值更强大,例如
a,b,c,d=1,2,3,4
a,b=b,a
变量默认都是全局的,局部变量在首次赋值时使用local
。
数值运算
除了c中的+,-,*,/,lua中还多了一个指数乘方运算”^
“,比如2^3=8。
连接两个字符串可以使用”..
“,例如,”this is a “ .. “string”连接后是“this is a string”。
比较运算
<, >, <=, >=, ==, ~=这些运算符总返回true或false。
Table,Function,Userdata类型的数据只有==,~=两个比较运算,相等表示两个变量引用的是同一个数据。
逻辑运算
and,or,not
在lua中,只有false和nil才被计算为false,其他任何数据都计算为true,包括0
。
and和or的运算结果不是true或false,而是和两个操作数相关,比如
a and b: 如果a为false,则返回a;否则返回b
a or b:如果a为true,则返回a;否则返回b
x = x or v:相当于
if not x then x = v end
参考这里