• lua 三目运算符


    【1】lua语言中完整的三目运算符

     完整三目运算符形式:(a and {b} or {c})[1]

    【2】分析原因

    大部分C或C++程序员经常会用到三目运算符(三元运算符),形如 a ? b : c; 的逻辑,即a为真,表达式值为b,否则表达式值为c。

    这样的逻辑在写lua的时候也常常需要用到,于是有人发明了形如 a and b or c 这种写法,下面来先来分析一下这个表达式的问题:

    Lua语言中的逻辑操作符有and、or和not。所有的逻辑操作符将 false 或 nil 视为假,而将除此之外的任何东西视为真。

    对于操作符and来说,若它的第一个操作数为假,就返回第一个操作数;否则返回第二个操作数。(即a与b,见假则假)

    对于操作符or来说,如果它的第一个操作数为真,就返回第一个操作数;否则返回第二个操作数。(即a或b,见真则真)

    lua的经典书籍《Lua程序设计》中还有一段写到:and和or都是用“短路求值”,也就是说,它们只会在需要时才会去判断第二个操作数。

    短路求值可以确保像(type(result) == "table" and result["msg"] == "OK")这样的表达式不会导致运行错误。

    “短路求值”可以保证在result不是table的情况,不会判断result["msg"] == "OK"的值而直接返回false。

    另外书中还提到“a and b or c”是一种类似于C语言中的表达式 a ? b : c 的习惯写法,可是并未指出其中的问题。

    但是,译者在此注明了观点,他指出如果要想让a and b or c等价于a ? b : c,前提是b表达式必须为真,也就是说b不能等于false或者nil。

    最后译者给出了建议,那就是在无法确认b为真的情况下,最常用的办法还是使用正常的if-else语句。

    说到这里可能有些人开始反迷糊,为什么b表达式的值必须为真呢?

    这个时候你可以写个例子尝试一下,如果b == false,那么无论a的表达式为真或者假,整体都会返回c的值。

    那么怎样才能保证b的值一直为真呢?实际的程序逻辑中是允许b为false或者nil的!

    写到这里也是为了记录一下,好奇之余从其他人学到的技巧:

    b表达式的外边包装一层table,写成{b}的形式,返回时再写成{b}[1]的形式就可以,那么整体的表达式就变成:(a and {b} or {c})[1]

    这样就满足第二个表达式恒为真的前提,今后你可以在lua中愉快地写三目运算符了!

    【3】示例

    (3.1)示例程序1

     1 local var_false = false
     2 
     3 local var_true = true
     4 
     5 -- 场景1:
     6 local a = 2
     7 local b = 1
     8 print('a > b and a or b : ' .. (a > b and a or b))
     9 print('a > b and false or b : ' .. (a > b and var_false or b))
    10 --print('a > b and true or b : ' .. (a > b and var_true or b))  语法错误
    11 print('(a > b and {a} or {b})[1] : ' .. (a > b and {a} or {b})[1])
    12 print()
    13 
    14 -- 场景2:
    15 a = 3
    16 b = 3
    17 print('a > b and a or b : ' .. (a > b and a or b))
    18 print('a > b and false or b : ' .. (a > b and var_false or b))
    19 print('a > b and true or b : ' .. (a > b and var_true or b))
    20 print('(a > b and {a} or {b})[1] : ' .. (a > b and {a} or {b})[1])
    21 print()
    22 
    23 -- 场景3:
    24 a = 4
    25 b = 5
    26 print('a > b and a or b : ' .. (a > b and a or b))
    27 print('a > b and false or b : ' .. (a > b and var_false or b))
    28 print('a > b and true or b : ' .. (a > b and var_true or b))
    29 print('(a > b and {a} or {b})[1] : ' .. (a > b and {a} or {b})[1])
    30 print()
    31 
    32 -- 运行结果:
    33 --[[
    34 a > b and a or b : 2
    35 a > b and false or b : 1
    36 (a > b and {a} or {b})[1] : 2
    37 
    38 a > b and a or b : 3
    39 a > b and false or b : 3
    40 a > b and true or b : 3
    41 (a > b and {a} or {b})[1] : 3
    42 
    43 a > b and a or b : 5
    44 a > b and false or b : 5
    45 a > b and true or b : 5
    46 (a > b and {a} or {b})[1] : 5
    47 --]]

    (3.2)示例程序2

     1 local a = true
     2 local b = false
     3 -- 场景1:
     4 print((a and {"true"})[1])
     5 -- 场景2:语法错误
     6 --print((b and {"true"})[1]) error: attempt to index a boolean value
     7 -- 场景3:
     8 print("a value : " .. (a and {"true"} or {"false"})[1])
     9 print("b value : " .. (b and {"true"} or {"false"})[1])
    10 
    11 --[[ 运行结果:
    12 true
    13 a value : true
    14 b value : false
    15 --]]


    Good Good Study Day Day Up

    顺序 选择 循环 总结

  • 相关阅读:
    .NET之API版本控制
    接口管理平台YApi
    .NET之WebAPI
    Hyperv安装Centos7
    nginx添加https模块
    基于centos8镜像,打包php的docker镜像
    jmeter生成HTML性能测试报告(转载)
    jmeter相关(转载)
    接口测试总结(转载)
    【解决了一个小问题】alert manager中的cluster.advertiseaddress参数是什么意思?
  • 原文地址:https://www.cnblogs.com/Braveliu/p/10473714.html
Copyright © 2020-2023  润新知