lua 表达式

目录

 

3.2关系操作符

3.3逻辑操作符

3.4 字符串连接:..

3.5优先级 

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继续深入学习打基础,比如原表继承等等。
--]]

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值