Lua 中的表达式包括数字常量、字符串常量、变量、一元运算符、二元运算符和函数调用。还可以是非传统的函数定义和表构造。
3.1 算术运算符
二元运算符: +、 -、 *、 /、 ^(加、减、乘、除、幂)
一元运算符: -(负值)
这些运算符的操作数都是实数。
例如,x^0.5将计算x的平方根,x^(-1/3)将计算x立方根的倒数
在Lua 5.0和Lua4.0中没有取模操作符%,可以根据以下规则实现相同的效果
对于整数来说,以上算是通常都是有意义的,计算结果的符号永远与第二个参数相同。而对于实数,则可能有其他用途。
例如,x%1的结果计算x的小数部分,
x = 3.1415926
print(x - floor(x/1)*1) -->0.1415926000000001
而x-x%1的结果计算其整数部分。
x = 3.1415926
print(x - (x - floor(x/1)*1)) -->3
类似地,x-x%0.01则是精准到小数点后两位的结果。
x = 3.1415926
print(x - (x - floor(x/0.01)*0.01)) -->3.14
3.6 表的构造 (table 构造式)(table constructor)
构造器是创建和初始化表的表达式,表是 Lua 特有的功能强大的东西,最简单的构造器是“{}”,用来创建一个空表。可以直接初始化数组(即“序列(sequence)” 或 “列表(list)”):
days = {"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"}
Lua 用"Sunday"初始化 days[1](第一个元素索引为 1),用"Monday"初始化 days[2]……
print(days[4]) --> Wednesday
构造函数可以使用任何表达式初始化:
tab = {sin(1), sin(2), sin(3), sin(4), sin(5),sin(6), sin(7), sin(8)}
Lua还提供了一种特殊的语法用于初始化记录风格的table:
以上这行代码等价于这些语句:
不管用何种方式创建表,我们都可以向表中添加或者删除任何类型的域,构造函数仅仅影响表的初始化。
w = {x = 0, y = 0, label = "console"}
x = {sin(0), sin(1), sin(2)}
w[1] = "another field"
x.f = w
print(w["x"]) --> 0
print(w[1]) --> another field
print(x.f[1]) --> another field
w.x = nil -- remove field "x"
下面介绍一种更一般的初始化方式,我们用“[表达式]”显式地表示将被初始化的索引:
opnames = {
["+"] = "add",
["-"] = "sub",
["*"] = "mul",
["/"] = "div"
}
i = 20; s = "-"
a = {
[i+0] = s,
[i+1] = s..s,
[i+2] = s..s..s
}
print(opnames[s]) --> sub
print(a[22]) --> ---
链表风格初始化和记录风格初始化是这种一般初始化的特例:
{x = 0, y = 0} <--> {["x"] = 0, ["y"] = 0}
{"red", "green", "blue"} <--> {[1] = "red", [2] = "green", [3] = "blue"}
对于某些情况如果真的需要以0作为一个数组的起始索引的话,通过这种语法也可以轻松做到:
days = {[0] = "Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"}
现在第一个值“Sunday”的索引就为0了。这个索引0并不影响其它元素,“Monday”照常索引为1,因为它是构造式中列表风格中的第一个值,后续其他值的索引依次递增。但无论是否使用这种初始化语法,都不推荐在Lua中以0作为数组的起始索引。大多数内建函数都假设数组起始于索引1,若遇到以索引0开始的数组,他们就无法进行正确的处理了。
在构造函数的最后的逗号是可选的,可以方便以后的扩展。
a = {[1] = "red", [2] = "green", [3] = "blue",}
在构造函数中域分隔符逗号可以用分号替代,通常我们使用分号用来分割不同类型的表元素,例如将列表部分与记录部分明显地区分开。
a = {x = 10, y = 45; "one", "two", "three"}
|