12.特殊语法
12.1 知识点
多变量赋值
- 多变量赋值语法:
变量1, 变量2, ...变量n = 值1, 值2, ...值n - 示例:
a, b, c = 1, 2, 3
print(a) -- 1
print(b) -- 2
print(c) -- 3
- 如果值不够匹配变量,未匹配到值的变量会是
nil。 - 示例:
a, b, c = 1, 2
print(a) -- 1
print(b) -- 2
print(c) -- nil
- 如果值比变量多,多出来的值不会被使用。
- 示例:
a, b, c = 1, 2, 3, 4, 5, 6
print(a) -- 1
print(b) -- 2
print(c) -- 3
- 这个语法实际写脚本时很常用,比如交换两个变量的值。
a = 1
b = 2
a, b = b, a
print(a) -- 2
print(b) -- 1
多返回值
- 多返回值语法:
return 值1, 值2, ...值n,一般用于函数中。 - 示例:
function Test()
return 1, 2, 3, 4
end
- 如果返回的值比用来接的变量多,多出来的值不会被使用。
- 示例:
a, b, c = Test()
print(a) -- 1
print(b) -- 2
print(c) -- 3
- 如果返回的值不够匹配用来接的变量,未匹配到值的变量会是
nil。 - 示例:
a, b, c, d, e = Test()
print(a) -- 1
print(b) -- 2
print(c) -- 3
print(d) -- 4
print(e) -- nil
Lua 的多返回值很实用,常见写法是一个函数同时返回结果和附加信息。基础阶段先记住:多出来的返回值会被丢掉,不够接的变量会补 nil。
and和or的特性
- 在 Lua 中,逻辑与
and和逻辑或or不只可以连接boolean,也可以连接其他类型的值。 - Lua 里只有
nil和false会被认为是假,其他值都认为是真。 and和or不一定返回true / false,它们返回的是参与运算的原始值。- 这是因为 Lua 的逻辑运算符是短路运算的。
- 短路可以简单理解成:前面的值已经能决定结果了,后面的表达式就不继续算了。
and
a and b- 如果
a是假,直接返回a。 - 如果
a是真,返回b。
print(1 and 2) -- 2,因为 1 为真,所以返回 2
print(0 and 1) -- 1,因为 0 在 Lua 中也是真,所以返回 1
print(nil and 1) -- nil,因为 nil 为假,所以直接返回 nil
print(false and 2) -- false,因为 false 为假,所以直接返回 false
print(true and 3) -- 3,因为 true 为真,所以返回 3
or
a or b- 如果
a是真,直接返回a。 - 如果
a是假,返回b。
print(true or 1) -- true,因为 true 为真,所以直接返回 true
print(false or 1) -- 1,因为 false 为假,所以返回 1
print(nil or 2) -- 2,因为 nil 为假,所以返回 2
这里不要把 Lua 的 and / or 完全当成 C# 里的 && / || 来理解。
C# 里逻辑表达式最后一般就是布尔值,Lua 这里返回的可能是数字、字符串、表,也可能是 nil 或 false。
and和or模拟三目运算符
- Lua 不支持 C# / C / JavaScript 那种三目运算符。
- 但是可以使用
and和or模拟一部分类似三目的写法。 - Lua 中常见的三目模拟写法:
result = (条件表达式) and 条件为真时返回值 or 条件为假时返回值
- 对应 C# 的三目运算符:
result = 条件表达式 ? 条件为真时返回值 : 条件为假时返回值;
- 示例:
x = 3
y = 2
local result = (x > y) and x or y -- 对应 C# 的三目运算符 x > y ? x : y
print(result) -- 3
如果 (x > y) 为真,那么:
(x > y) and x -- 返回 x
x or y -- x 为真,返回 x
所以最后结果是 x。
如果 (x > y) 为假:
(x > y) and x -- 返回 false
false or y -- 返回 y
所以最后结果是 y。
再看一个条件不成立的例子:
x = 1
y = 2
local result = (x > y) and x or y -- 对应 C# 的三目运算符 x > y ? x : y
print(result) -- 2
- 注意:这种写法有坑。
- 如果“条件为真时返回值”本身可能是
false或nil,就会继续走到or后面的分支。 - 这种场景不要硬写
and / or,直接写if / else更稳。
local result = true and false or "默认值"
print(result) -- 默认值
上面这个例子里,条件明明是 true,但是中间结果是 false,最后还是走到了 or 后面的 "默认值"。
所以 and / or 模拟三目只适合简单场景,不要为了少写几行代码把逻辑写得很绕。
12.2 知识点代码
Lesson12_特殊语法.lua
print("**********特殊用法************")
print("**********知识点一 多变量赋值************")
-- 多变量赋值语法:变量1, 变量2, ...变量n = 值1, 值2, ...值n
a, b, c = 1, 2, 3
print(a) -- 1
print(b) -- 2
print(c) -- 3
-- 如果值不够匹配变量,未匹配到值的变量会是 nil
a, b, c = 1, 2
print(a) -- 1
print(b) -- 2
print(c) -- nil
-- 如果值比变量多,多出来的值不会被使用
a, b, c = 1, 2, 3, 4, 5, 6
print(a) -- 1
print(b) -- 2
print(c) -- 3
-- 多变量赋值也常用来交换两个变量的值
a = 1
b = 2
a, b = b, a
print(a) -- 2
print(b) -- 1
print("**********知识点二 多返回值************")
-- 多返回值语法:return 值1, 值2, ...值n,一般用于函数中
function Test()
return 1, 2, 3, 4
end
-- 如果返回的值比用来接的变量多,多出来的值不会被使用
a, b, c = Test()
print(a) -- 1
print(b) -- 2
print(c) -- 3
-- 如果返回的值不够匹配用来接的变量,未匹配到值的变量会是 nil
a, b, c, d, e = Test()
print(a) -- 1
print(b) -- 2
print(c) -- 3
print(d) -- 4
print(e) -- nil
print("**********知识点三 and和or的特性************")
-- 在 Lua 中,逻辑与 and 和逻辑或 or 不只可以连接 boolean
-- 其他类型的值也可以参与 and / or 运算
-- Lua 里只有 nil 和 false 会被认为是假,其他值都认为是真
-- and 和 or 不一定返回 true / false,它们返回的是参与运算的原始值
-- 这是因为 Lua 的逻辑运算符是短路运算的
-- 短路可以简单理解成:前面的值已经能决定结果了,后面的表达式就不继续算了
-- and:
-- a and b
-- 如果 a 是假,直接返回 a
-- 如果 a 是真,返回 b
print(1 and 2) -- 2,因为 1 为真,所以返回 2
print(0 and 1) -- 1,因为 0 在 Lua 中也是真,所以返回 1
print(nil and 1) -- nil,因为 nil 为假,所以直接返回 nil
print(false and 2) -- false,因为 false 为假,所以直接返回 false
print(true and 3) -- 3,因为 true 为真,所以返回 3
-- or:
-- a or b
-- 如果 a 是真,直接返回 a
-- 如果 a 是假,返回 b
print(true or 1) -- true,因为 true 为真,所以直接返回 true
print(false or 1) -- 1,因为 false 为假,所以返回 1
print(nil or 2) -- 2,因为 nil 为假,所以返回 2
-- Lua 不支持 C# / C / JavaScript 那种三目运算符
-- 但是可以使用 and 和 or 模拟一部分类似三目的写法
-- Lua 中常见的三目模拟:
-- result = (条件表达式) and 条件为真时返回值 or 条件为假时返回值
-- C# 中的三目运算符语法:
-- result = 条件表达式 ? 条件为真时返回值 : 条件为假时返回值;
x = 3
y = 2
local result = (x > y) and x or y -- 对应 C# 的三目运算符 x > y ? x : y
print(result) -- 3
-- 如果 (x > y) 为真,那么:
-- (x > y) and x -> x
-- x or y -> x
x = 1
y = 2
local result = (x > y) and x or y -- 对应 C# 的三目运算符 x > y ? x : y
print(result) -- 2
-- 如果 (x > y) 为假,那么:
-- (x > y) and x -> false
-- false or y -> y
-- 注意:
-- 这种写法有坑
-- 如果“条件为真时返回值”本身可能是 false 或 nil,就会继续走到 or 后面的分支
-- 这种场景不要硬写 and / or,直接写 if / else 更稳
local result = true and false or "默认值"
print(result) -- 默认值
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com