開頭先說結論
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}”,就不會影響結果啦。