类型与值
基础类型
1. nil(空)
表示无效,
2. boolean(布尔)
true or false;lua将false和nil视为假,0和空字符串视为真,
3. number(数字)
实数,lua没有整数和浮点数之分,可以使用科学计算法、
4. string(字符串)
lua字符串是不可变值,不能直接修改字符串中的某个字符,而应该创建一个新的字符串,
a = "one string";
b = string.gsub(a, "one", "anothor");
字符串可以使用单引号或双引号;包含类型C语言的转义;多行字符串([[ “” ]]):
page = [[
<html>
<head>
</head>
</html>
]];
字符串连接:.. ,例如
print(10 .. 20);
转换字符串:tostring(10);
字符串长度:在字符串前面放置操作符“#”获取字符串长度,
print(#str)
5. userdata(自定义类型)
userdata用于表示一种由应用程序或C创建的新类型,标准IO库就用userdata表示文件的,可以将任意C数据存储到lua变量中、
6. function(函数)
可以存储在变量中,可以通过参数传递给其它函数,可以作为其它函数的返回值;lua所有的标准库都是用C写的,lua和C可以互调、
7. thread(线程)
8.table(表)
一个关联数组,“关联数组”是一种具有特殊索引方式的数组,大小可变。
lua通过table表示模块、包、对象。io.read 表示 io模块中的read函数,而对于lua这表示使用字符串“read”作为key来索引table io;
table是对象,可以看做一个“匿名对象”,lua不会暗中产生table的副本或创建新的table,仅持有一个引用;
创建空table:a = {};最简单的表达式就是“{}”;
table变量与table自身之间没有固定的关联性,属性可以自由的加入和取出;添加或修改:a[“x”] = 10; 删除:a[“x”] = nil;
--[[
a = {}
x = "y"
a[x] = 10
]]
a[“y”] 等价于 a.y;a.y表示key为y来索引table;
表示数组和线性表:用整数作为key来使用table;自动生成的索引从1开始;
数组或线性表的长度获取:“#”操作符,和字符串用法一致,Lua将nil作为界定数组结尾的标志,如果数组有中间含有nil时,操作符会认为这些nil元素就是结尾标志;
返回table的最大正索引数:table.maxn;
]]
表达式
1. 算术操作符
和其它语言基本一致。
2. 关系操作符
和其它语言唯一区别是“!=” 变成了 “~=”;table、userdata和函数都是做“引用比较”,只有当它们引用引用同一个对象时,才认为它们相等;除字符串和数字之外的其它类型只能相等或不等比较;不同类型之间大小比较直接导致错误;
3. 逻辑操作符(and,or,not)
与条件控制语句一致,所有逻辑操作符将false和nil视为假,其它任何东西视为真;操作符规则和其它语言一致;
4. 操作符优先级
“^”和“..”是右结合,其它都是左结合。
table的构造
空构造:
a = {}
构造数组:
a = {"1", "2", "3", "4", "5"}
a = {x = 10, y = 20}等价于 a = {}; a.x = 10; a.y = 20
添加属性:a.x = 1,如果table a中有key为“x”的属性,该语句为修改,如果没有就会添加“x”到table中。(有点像JavaScript那么随意)
删除属性:a.x = nil
初始化方式嵌套:
a = {name = "android", {x = 1, y = 2}, {x = 3, y = 4}}
访问:
a.name ---> android
a["name"] ---> android
a[1] ---> 1
table可以在最后一个元素后面写一个逗号;可以用“;”“,”分隔元素
{x = 1, y = 2, "x"; "y", }
语句
1. 多重赋值
a, b, c = 1, 2
x, y = y, x
若值的个数少于变量个数,那么多余的变量会被赋为nil;若值的个数更多的话,那么多余的值会被直接丢弃掉;
2. 局部变量
local修饰变量, 例:local a = 1;
3. 显示的定义一个程序块
使用关键字:do - end
do
local a = 1
local d = a*2
c = a+b
end
3. 控制语句,lua不支持switch语句
if - elseif - else - end
if a>0 then
a=1
end
if a>0 then
a = 1
else
a = -1
end
if a>0 then
a = 1
elseif a == 0 then
a = -1
else
a = 0
end
4. while
local i = 1
while a[i] do
print(a[i])
i = i+1
end
5. repeat - until
repeat
line = io.read()
until line ~= ""
local sqr = x/2
repeat
sqr = (sqr + x/sqr)/2
local error = math.abs(sqr^2 - x)
until error < x/10000 --在这里还能访问循环体中的局部变量
6. for
for i=exp1,exp2,exp3 do
print(i)
end
表示 i 从exp1变化到exp2,每次都以exp3作为步长递增,exp3可缺省则默认为1,并执行一个“执行体”。
exp1,exp2,exp3都是在循环开始前一次性求值,只会执行一次;控制变量 i 会被自动什么为for语句的局部变量,仅在循环体内可见。
7. 泛型for
for i,v in ipairs(table_name) do
print(i,v)
end
迭代器ipairs,用于遍历数组的迭代器函数,每次在循环中,i 会被赋予一个索引值,同时 v 被赋予对应的元素值。
8. break 与 return
break:结束当前循环
return:结束当前程序块,只能放在end、else、until前一条,其它地方要么不起作用,要么报错。
function fun()
return --这里不起作用
do
return --这样就可以不执行函数后面的语句,直接跳出函数了
end
print("hello lua")
end