UH2S1L9——特殊用法

本章代码关键字

1
... and ... or ...        --使用Lua的and与or的特性,模拟的一个三目运算符

多变量赋值

一行代码可以为多个变量赋值,如果后面的值不够,则后面的变量自动补空,如果后面的值过多,则多余的值被忽略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
print("**********多变量赋值************")
local a, b, c = 1, 2, "123"
print(a)
print(b)
print(c)

local a, b, c = 1, 2
print(a)
print(b)
print(c) --nil

local a, b, c = 1, 2, 3, 4, 5, 6
print(a)
print(b)
print(c)
1
2
3
4
5
6
7
8
9
10
**********多变量赋值************
1
2
123
1
2
nil
1
2
3

多返回值

函数可以返回多个值,用几个变量接收就有几个值,如果少了,就少接几个,如果多了就自动补空

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print("**********多返回值************")
function Test()
return 10, 20, 30, 40
end

a, b, c = Test()
print(a)
print(b)
print(c)

a, b, c, d, e = Test()
print(a)
print(b)
print(c)
print(d)
print(e)
1
2
3
4
5
6
7
8
9
**********多返回值************
10
20
30
10
20
30
40
nil

and or

在Lua中,逻辑运算符and​和or​不仅可以连接boolean​值,任何值都可以用来连接
在Lua中,只有nil​和false​才认为是假(0也不算假)

Lua的逻辑运算符也有短路特性,因此and遇到false或者nil,就返回false或者nil
如果and连接起来的值没有false或者nil,它就会返回and连接的最后一个值

1
2
3
4
5
6
7
print( 1 and 2 )
print( 0 and 1 )
print( nil and 1 )
print( false and 1 )
print( true and 3 )
print( true and 3 and 2 )
print( true and "a" and nil and 2 )
1
2
3
4
5
6
7
2
1
nil
false
3
2
nil

Lua的逻辑运算符也有短路特性,因此or遇到非false或者nil的值,就直接返回那个值
如果or连接起来的值全部是false或者nil,它就会返回or连接的最后一个值(false或者nil

1
2
3
4
5
print( true or 1 )
print( false or 1 )
print( nil or 2 )
print( 2 or "1" or false or nil )
print( false or nil or false or nil )
1
2
3
4
5
true
1
2
2
nil

所以,虽然Lua不支持三目运算符,但是Lua可以用and​和or​来模拟一个三目运算符,
(条件表达式) and 为真时返回值 or 为假时返回值​,对应条件表达式 ? 为真时返回值 : 为假时返回值

思路是这样的:

  • 当前面的条件表达式为非false​或者nil​时,由于无假返回真,(条件表达式) and 为真时返回值​返回为真时返回值​,
    此时就有为真时返回值 or 为假时返回值​,由于有真返回真,因此先返回前面的为真时返回值
  • 当前面的条件表达式为false​或者nil​时,由于有假返回假,(条件表达式) and 为真时返回值​返回false​或者nil​,
    此时就有false/nil or 为假时返回值​,由于有真返回真,因此返回后面的为假时返回值​(即使后面也是false​或者nil​,也是返回后面的那个)
1
2
3
4
5
6
7
8
9
local x = 3
local y = 2
local result = (x > y) and x or y
print(result)

local x = 1
local y = 2
local result = (x > y) and x or y
print(result)
1
2
3
2