12.特殊语法

  1. 12.特殊语法
    1. 12.1 知识点
      1. 多变量赋值
      2. 多返回值
      3. and和or的特性
        1. and
        2. or
      4. and和or模拟三目运算符
    2. 12.2 知识点代码
      1. Lesson12_特殊语法.lua

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 里只有 nilfalse 会被认为是假,其他值都认为是真。
  • andor 不一定返回 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 这里返回的可能是数字、字符串、表,也可能是 nilfalse

and和or模拟三目运算符

  • Lua 不支持 C# / C / JavaScript 那种三目运算符。
  • 但是可以使用 andor 模拟一部分类似三目的写法。
  • 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
  • 注意:这种写法有坑。
  • 如果“条件为真时返回值”本身可能是 falsenil,就会继续走到 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

×

喜欢就点赞,疼爱就打赏