lua中的三目运算符
开头先说结论
1.简单版三目运算符(需要自我保证“b”不为“false”)
a and b or c
2.通用版三目运算符
(a and {b} or {c})[1]
浅谈推导过程
我们首先需要知道lua中的以下几点规则
1.lua中只有“false”和“nil”视为“假”,其他任何一切都为“真”,包括“0”。
2.对于运算符“and”来说,假设它的第一个操作数为“假”,就返回第一个操作数;不然返回第二个操作数。
3.对于运算符”or”来说,假设它的第一个操作数为”真”。就返回第一个操作数,不然返回第二个操作数。
现在我们假设三个变量
local a = true
local b = true
local c = false
先说“and”
a and b 返回 true(这里的true为b)
然后“or”
true(这里的true为b) or c 返回 true(这里的true为b)
我们再来假设三个变量
local a = false
local b = true
local c = false
先说“and”
a and b 返回 false(这里的false为a)
然后“or”
false(这里的false为a) or c 返回 false(这里的false为c)
所以
ret = a and b or c
当 a 为 true 时 ret = b
当 a 为 false 时 ret = c
这里已经得出一个简单的三目运算符 “a and b or c”,你以为这就完了吗?
但是!
这是基于a的变化 并且 b = true, c = false 的情况
我们重新再来假设三个变量
local a = true
local b = false
local c = true
先说“and”
a and b 返回 false(这里的false为b)
然后“or”
false(这里的false为b) or c 返回 true(这里的true为c)
记下这个返回值
我们叕假设三个变量
local a = false
local b = false
local c = true
先说“and”
a and b 返回 false(这里的false为a)
然后“or”
false(这里的false为a) or c 返回 true(这里的true为c)
所以
ret = a and b or c
当 a 为 true 时 ret = c
当 a 为 false 时 ret = c
是不是发现问题了
无论a是“true”还是“false”最终返回结果都是“c”
这显然不是我们想要的结果,那么问题出在哪里呢?
通过上面拆开的步骤来看,都是出现在了第二次“or”运算当中
【对于运算符”or”来说,假设它的第一个操作数为”真”。就返回第一个操作数,不然返回第二个操作数。】
因为这一条的存在 所以 只要 b = false 不论 第一步 “and” 运算的结果如何 最终 “or” 的 结果 都会指向C
所以我们进一步优化就得出以下
(a and {b} or {c})[1]
这样即使 b = false 但判断的过程中却是判断 “{false}”,就不会影响结果啦。
lua中的三目运算符的更多相关文章
- lua中基类和“继承机制”
基类:基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法. 继承:继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类. lu ...
- lua中实现异步资源读写
同样还是更新方面的需求,当我们检测到版本是新安装的以后,要进行upd目录清除.如果使用os.execute执行 rm -rf ooxx 是非常快的但由于os.execute一旦报错,那整个lua进程就 ...
- lua中清空目录和递归创建目录
lua中的 lfs.mkdir lfs.rmdir只能针对单个目录,且lfs.rmdir不能清空文件夹 于是我想到了使用os.execute 递归创建目录如下os.execute("mkdi ...
- lua中的string类型
在lua中用union TString来表示字符串类型 lobject.h: 其中结构体tsv中 reserved字段表示字符串是不是保留关键字,hash是其哈希值,len是其长度.我们在TStrin ...
- 在 lua 中实现函数的重载
在 lua 中实现函数的重载.注:好吧,lua中原来可以实现重载...local function create() local arg_table = {} local function dispa ...
- lua中的table、stack和registery
ok,前面准备给一个dll写wrapper,写了篇日志,看似写的比较明白了,但是其实有很多米有弄明白的.比如PIL中使用的element,key,tname,field这些,还是比较容易混淆的.今天正 ...
- lua中的协程
lua中的协程和线程类似: 1. 协程拥有自己的独立的栈,局部变量,和指令: 2. 所有协程都可以共享全局变量: 3. 协程不能像线程那样并行执行,协程之间需要相互协调执行,同一个时刻只能运行一个协程 ...
- lua 中的面向对象
lua 是一种脚步语言,语言本身并不具备面向对象的特性. 但是我们依然可以利用语言的特性,模拟出面向对象的特性. 面向对象的特性通常会具备:封装,继承,多态的特性,如何在lua中实现这些特性,最主要的 ...
- lua中for循环的四种遍历方式
lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3 key,value pairs 取每一 ...
随机推荐
- Python小组作业:基于yolov5的口罩佩戴识别
Python老师给了三个小组项目:1.自身专业问题 2.人工智能 3.游戏或者小工具 提前告知了,写游戏不好拿高分,小工具又不能展示自己的水平.大一刚来也没碰到什么专业问题,于是经过讨论,决定了做人工 ...
- MySQL 分区表,为什么分区键必须是主键的一部分?
随着业务的不断发展,数据库中的数据会越来越多,相应地,单表的数据量也会越到越大,大到一个临界值,单表的查询性能就会下降. 这个临界值,并不能一概而论,它与硬件能力.具体业务有关. 虽然在很多 MySQ ...
- LuoguP7593 凑数 题解
Content 给定 \(n\) 个整数 \(1,2,\dots,n\),请问是否能从这 \(n\) 个数中恰好选 \(k\) 个数,使得这 \(k\) 个数的和为 \(s\). 数据范围:\(t\) ...
- 第二周Python笔记 数据类型 列表 字典
列表,拉锁式儿合并. [ [a,b] for a,b in zip(list1,list2)] #最笨的 a=[1,2,3,4,5] b=[2,3,4,5,6] d=[] for i in range ...
- Could not synchronize database state with session问题,说保存空
Could not synchronize database state with session问题,说保存空 ,可以在post.hbm.xml文件里设置inverse="true&quo ...
- 使用.NET 6开发TodoList应用(8)——实现全局异常处理
系列导航 使用.NET 6开发TodoList应用文章索引 需求 因为在项目中,会有各种各样的领域异常或系统异常被抛出来,那么在Controller里就需要进行完整的try-catch捕获,并根据是否 ...
- 【LeetCode】962. Maximum Width Ramp 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址:https://leetco ...
- 【LeetCode】144. Binary Tree Preorder Traversal 解题报告(Python&C++&Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 题目地址:https://leetc ...
- 【LeetCode】287. Find the Duplicate Number 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 保存已经访问过的数字 链表成环 二分查找 日期 题目 ...
- Robot(hdu5673)
Robot Accepts: 92 Submissions: 188 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 ...