Lua 是一种动态类型的语言。在语言中没有类型定义的语法,每个值都”携带“了它自身的类型信息。
Lua中有 8 种基础类型: nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、function(函数)、thread(线程)和table(表)。
Lua 中可以通过 type() 来得到 值 的类型。
print(type("Hello world")); -->string
print(type(10.4*3)); -->number
print(type(type)); -->function
print(type(true)); -->boolean
print(type(nil)); -->nil
值得一提的是,在 Lua 中,只有 nil 和 false 为假,除此之外的值均为 “真”。
类似数组的东西,但不是数组(关联数组),我认为table的本质就是保存了索引值的特殊数组。
注意:索引从1开始。
a = {
name = "小明",
age = 20,
{x = 0,y = -10}
}
print(a.name); -->小明
print(a[1].x); -->0
print(a[2].x); -->nil
table可以使用任何类型当索引值
用默认数字索引
local a = {[1] = 12, [2] = 43, [3] = 45, [4] = 90}
print(a[1]); -->12
local b = {12, 43, 45, 90}
print(b[1]); -->12
用table索引
local a = {{x = 1, y = 2},{x = 3, y = 10}}
用function索引
function test()
print("Hello Table");
end
local a = {[test] = 1};
print(a[test]);
Lua的算术操作符基本没有什么改变,只是有一些新的操作符
“^”(指数),”%”(取摸)
a % b == a - floor(a / b) * b;
x % 1 (取x的小数部分),x - x%1(取x整数部分),x - x%0.01(x精确到小数点后两位)
x = math.pi; -->π
print(x - x%1); -->3
Lua里面使用 “..” 连接字符串
print("A".."B".."c".."D"); -->ABcD
print("A"..1); -->A1
print("A" + 1); -->非法,报错
Lua提供了以下关系操作符:
< > <= >= == ~=
其中 ~= 用于不等性测试,== 用于等性测试。需要注意的是 nil 只与其自身相等。
对于 table,userdata和函数,Lua是作引用比较的。只有当它们引用的同一个对象时,才相等。
a = {}; a.x = 1; a.y = 0;
b = {}; b.x = 1; b.y = 0;
c = a;
print(a == c); -->true
print(a == b); -->false
对两个字符串作大小性比较时,按照字母次序比较字符串。具体的字母次序取决于对Lua的区域设置。
逻辑操作符有 and、 or、 not。
and:如果它的第一个操作数为假,就返回第一个操作数,否则返回第二个操作数。
or: 如果它的第一个操作数为真,就返回第一个操作数,否则返回第二个操作数。
print(4 and 5); -->5
print(4 or 5); -->4
x = x or v; 等价于:if not x then x = v end;
(a and b ) or c; 等价于: a ? b : c;
Lua允许 “多重赋值”,也就是一下子将多个赋值予多个变量。每个值或每个变量之间以逗号分隔。
a, b = 10, 2; -->赋值后,变量a = 10,b = 2。
x, y = y, x; -->交换x与y。
a[i], a[j] = a[j], a[i]; -->交换a[i]与a[j]。
a, b, c = 0, 1;
print(a, b, c); -->0 1 nil
a, b = a+1, b+1, b+2; -->其中 b+2 会被忽略
print(a, b) -->1 2
假设函数 f() 有两个返回值
a, b = f();
a接收第一个,b接收第二个。