目录
3.6 table构造式(table constructor)
3.2关系操作符
lua提供了以下关系操作符:
< > <= >= == ~=
所有这些操作符的运算结果都是true或false
- ==用于相等性测试
- ~=用于不等性测试
以上两个操作符可以应用于任意两个值,如果不同类型,lua认为它们是不相等的。否则,lua会根据他们的类型来比较两者。特别需要说明的是,nil只与自身相等。
对于table、userdata和函数,lua是作引用比较的。只有当它们引用同一个对象是,才认为它们是相等的。
- 只能对两个数字或两个字符串作大小性比较。Lua是按照字母次序(alphabetical order)比较字符串的,具体的字母次序取决于对Lua的区域设置。
3.3逻辑操作符
逻辑操作符有 and、or和not。与条件控制语句一样,所有的逻辑操作符将false和nil视为假,而将其它任何东西视为真。
and和or都使用“短路求值(short-cut evaluation)”,也就是说,他们只会在需要时才会去评估第二个操作数。短路求值可以确保像(type(v) == "table" and v.tag == "h1")这样的表达式不会导致运行时错误。
- 一种常用的Lua习惯写法"x = x or v",它等价于:
if not x then x = v end
-- 它可用在没有设置x的时候(即对x的求职结果为假时),将其设为一个默认值v
- 另外还有一种习惯写法时"(a and b) or c",这类似于C语言中的表达式 a?b:c,但前提是b不为假。例如为了选出数字x和y中的较大者,可以使用一下语句:
max = (x > y)and x or y
3.4 字符串连接:..
3.5优先级
Lua操作符的优先级如表3-1所示(从高到低)
在二元操作符中,除了指数操作符“^”和连接操作符“..”是“右结合”的,所有其它操作符都是“左结合(left associative)”的。
小技巧:若不确定某些操作符的优先级是,就应显示地用括号来制定所期望的运算次序。这比查参考手册方便得多,而且当再次阅读代码是,也不会产生什么疑问。
3.6 table构造式(table constructor)
构造式是用于创建和初始化table的表达式。这是lua特有的一种表达式,也是lua最有用、最通用的机制之一。
以下几个方式只是其中一些,并非全部,风格完全由自己决定
- 最简单的构造式:空构造式 {},用于创建一个空table。emptyTable = {}
- 还可用于初始化数组
local days = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
--[[
lua数组小标从1开始,间隔为1,因此,days[1] = "Sunday",以此类推
--]]
- 用于初始化记录风格的table
local a = {x = 10, y = 20}
--以上这行代码等价于这些语句
--[[
local a = {}
a.x = 10
a.y = 20
--]]
无论使用哪种方式来创建table,都可以在table创建之后添加或删除其中的某些字段,例如以下代码
local w = {x = 0, y = 0, lable = "console"}
local x = {math.sin(0), math.sin(1), math.sin(2)}
w[1] = "another field" --添加key 1到table w
x.f = w --添加key "f"到table x
print(w["x"]) --> 0
print(w[1]) --> another field
print(x.f[1]) --> another field
w.x = nil --> 删除字段"x"
顺便一提,所有table都可以构建成一样的,而构造式只是在table的初始化时刻发挥作用。
每当Lua评估一个构造式是,都会先创建一个新table,然后初始化他。
如果已经完全理解上面这两句的意思,下面的代码也很好理解,这样,就能用table写出一下的链表代码:
local list = nil
for line in io.lines() do
list = {next = list, value = line}
end
--[[
这段代码从标准输入中读取每行的内容,然后将每行按相反的次序存储到一个链表中。
链表的每个节点都是一个table,table中含有两个字段:value(每行的内容)和next(指向
下一个节点的引用)。以下代码遍历了该链表,并打印了其内容:
--]]
local l = list
while l do
print(l.value)
l = l.next
end
--[[
上例虽具有一定的教学意义,但真实在Lua程序中很少会用到链表。列表数据一般是通过数组来实现的。
将记录风格的初始化与列表风格的初始化混合在一个构造式中使用:
--]]
local polyline = {color = "blue", thickness = 2, npoints = 4,
{x = 0, y = 0},
{x = -10, y = 0},
{x = -10, y = 1},
{x = 0, y = 1},
}
--[[
上例演示了如何通过嵌套的构造式来表示复杂的数据结构。每个polyline[i]元素都是一个table,表示一条记录。这里相当于为后续table继续深入学习打基础,比如原表继承等等。
--]]