推荐阅读书籍《Lua - 程序设计》第四版
全局变量不需要声明 没有初始化的全局变量也不会出错,只是得到结果nil
print(a) --> nil
a = 1
print(a) --> 1
删除全局变量,直接赋值nil
即可
a = nil
print(a) -->nil
保留字:以下字符为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可以删除该变量
取值false和true。注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真
可以做实数也可以做整数。Lua可以处理任何长整数
Lua的字符串是不可以修改的,你可以重新创建个变量
a = 'Carlos'
c = "Carlos"
print(a) --> Carlos
print(c) --> Carlos
可以使用单引号或者双引号表示字符串
还可以使用[[...]]
表示字符串
\a
\b -- 后退
\f -- 换页
\n -- 换行
\r -- 回车
\t -- 制表
\v
\\ -- "\"
\" -- 双引号
\' -- 单引号
\[ -- 左中括号
\] -- 右中括号
Lua会自动在string
和numbers
之间自动进行类型转换
print("5" + 1) --> 6
print("5 + 1") --> 5 + 1
当Lua碰到string
碰到数字时,自动转换数字为string
print(50 .. 50) --> 5050
..
连接字符串 在一个数字后面写…时,必须加上空格以防止被解释错。
tonumber
string转成数字,如果string不是正确的数字返回nil
tostring
数字转成字符串
Lua可以调用lua或者C实现的函数,Lua所有标准库都是用C实现的。标准库包括string库、table库、I/O库、OS库、算术库、debug库。
函数可以是一个变量、函数的参数、作为函数的返回值
userdata可以将C数据存放在Lua变量中,userdata在Lua中除了赋值和相等比较外没有预定义的操作。userdata用来描述应用程序或者使用C实现的库创建的新类型。
+ - * / ^ (加减乘除幂)
- (负值)
这些运算符的操作数都是实数。
< > <= >= == ~=
返回结果为false或者true
Lua比较数字按传统的数字大小进行,比较字符串按字母的顺序进行,但是字母顺序依赖于本地环境。
and or not
and的优先级比or高。
逻辑运算符认为false和nil是假,其他为真,0也是true.
and
和or
的运算结果不是true和false,而是和它的两个操作数相关。
a and b -->如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b
--例子
print(5 and 10) --> 10
print(nil and 1) --> nil
print(5 or 10) --> 5
print(false or 1) -->1
实用的小技巧
a = nil
c = 10
x = a or c
print(x) -->10
以上写法等于以下写法
if not a then
x = c
end
not
的结果只返回false或者true
print(not nil) --> true
print(not false) --> true
print(not 0) --> false
print(not not nil) --> false
..
连接字符串 前面就演示过
优先级
高到低
^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or
除了^和…外所有的二元运算符都是左连接的。
表是Lua最强大的功能
最简单的构造{}
用来创建一个空表,直接初始化数组
t = {1,2,3,4,}
print(t[0]) -->0 --lua的索引是从1开始的,你也可以设置0
print(t[2]) -->2
print(#t) -->4
--构造表可以使用任何表达式初始化
tt = {a = 0, b = 0} 等价于 tt = {}; tt.a = 0; tt.b = 0
#
遍历表中的所有数组
我们可以向表添加或删除任何类型的域
t = {x = 0, y = 0,c = "carlos"}
x = {}
t[1] = "数组"
x.f = t
print(t["x"]) -->0
print(t[1]) -->数组
print(x.f[1]) -->数组
x.f[1] = nil
print(x.f[1]) -->nil
注意:不推荐数组下标从0开始,否则很多标准库不能使用。
在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素。
赋值是改变一个变量的值和改变表域的最基本的方法。
a = "carlos" .. "lua" --> carloslua
t = {}
t.n = 5
t.n = t.n + 1
print(t.n) -->6
可以对多个变量赋值,变量和值用,
分开,右边赋值会传递到左边的变量
a,b,c = 1,2,3 等价于 a = 1 b = 1 c = 1
赋值语句是从右边计算再传到左边,所以我们可以交换变量的值
a,b = 5,10
a,b = b,a
print(a,b) -->10 5
当变量个数和值的个数不一致
变量个数 > 值的个数 --多出的变量个数补充为nil
例子:a,b,c = 1,2
print(a,b,c) -- 1 2 nil
变量个数 < 值的个数 --多出的值会被忽略
例子:a,b = 1,2,3
print(a,b) -- 1 2
除了交换变量还可以讲函数调用返回到变量
function f ()
return 1,2
end
a,b = f()
print(a,b) -- 1 2
f()
返回两个值,第一个赋给a
,第二个赋给b
。
局部变量只在被声明的代码块内有效
代码块:一个函数,一个控制结构,或者变量被声明的文件或者文本串
local i = 50
function f ()
local x = 20
print(x,"函数内有效") --> 20
end
print(x,"已在函数外无效") --> nil
print(i,"这个文件内有效") --> 50
多使用局部变量,避免重名冲突,访问局部变量比全局变量速度要快
还可以使用do
和end
来划分一个界限
do
local i = 20
print(i,"界限内 有值") -->20
end
print(i,"界限外,无效") -->nil
这样更好的控制了局部变量的范围,是不是很舒服
控制结构的结果可以是任何值
false和nil是假,其他是真
--第一种
local i = 20
if i > 1 then
print("值为",i)
end
--第二种 else
if i > 20 then
print("值为",i)
else
print("大于20")
end
--第三种 elseif
if i > 1 then
print("值为",i)
local b = 1
elseif b < 5 then
print("值大于5")
else
print("大于20")
end
--while 循环 判断条件为false中止循环
local i = 0
while i<20 do
print(i) --> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
i = i + 1
end
-- 那如果我们要在中途退出循环呢?那我们加一个break
local i = 0
while i<20 do
print(i) -->0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
i = i + 1
if i > 15 then
print("中止") -->中止
break
end
end
--repeat-until 循环
local i = 1
repeat
print(i) --> 1 2 3 4 5
i = i + 1
until i > 5
--for 数值循环 控制变量i是局部变量自动声明,只在循环内有效
for i=10,5,-1 do
print(i) -->10 9 8 7 6 5
end
--需要保留控制变量的值,在循环中将其保存
local f = nil
for i=1,10,1 do
f = i
end
print(f) --> 10
break
语句用来退出当前循环(for
、repeat
、while
)循环外部不可以使用
return
用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return
--Lua语法要求break和return只能出现在block的结尾一句
--有时候需要在block的中间使用return或者break 可以用do.end
function f (i)
do
return i
end
end
print(f(123)) --> 123
--return 列出要返回的值
function f (i)
local a = 1
local aa = i[a]
for i,v in ipairs(i) do
if val > a then
aa = i
a = v
end
end
return a, aa
end
print(f({1,2,3,4,5,6})) --> 6 6