local a = {}
local b = {}
local c,d = (a~=nil) and 1,1 or 0,0 -- prints "1 1"
local c,d = (a==nil) and 1,1 or 0,0 -- prints "false 1"
print(c,d)
我知道为什么会这样。有没有办法打印" 0 0"?
答案 0 :(得分:5)
有没有办法打印" 0 0"?
不,因为and or
表达式总是会返回一个结果,而您看到的结果可能不是您认为的结果。
本地c,d =(a~ = nil)和1,1或0,0 - 打印" 1 1"
这计算为((a~=nil) and 1),(1 or 0),0
。第一个表达式返回1,第二个表达式(1 or 0
)返回1,最后一个表达式被忽略(因为左侧有两个变量,右侧有三个表达式。)
本地c,d =(a == nil)和1,1或0,0 - 打印" false 1"
这是以类似的方式计算的,除了(a==nil)
是false
,这就是你得到第二个结果的原因。
要执行您想要的操作,您需要将其拆分为两个表达式:一个用于c
,另一个用于d
。
答案 1 :(得分:1)
如果你真的想以最紧凑的方式做到这一点,你可以创建一个功能来做到这一点。我通常只在每个条件下使用一个参数,但如果你绝对需要一个处理倍数的方法,有两种方法可以做到。
选项#1:拿表:
function iff(cond, tbl1, tbl2)
if(cond) then
return unpack(tbl1)
else
return unpack(tbl2)
end
end
显然,这要求您始终传递表格。如果您只需要单个值,那么您需要该函数的第二个版本。这比根据类型添加条件逻辑更好,从而减慢了代码的速度。
选项#2:Variadic:
--Number of parameters ought to be even.
--The first half are returned if the condition is true,
--the second half if it is false.
function iff(cond, ...)
if(cond) then
return ... --Yes, you're returning all of them, but the user shouldn't be trying to take more than the first half.
else
return select((select("#", ...)) / 2, ...)
end
end
答案 2 :(得分:0)
正如" Paul Kulchenko所指出的那样#34;在他的最后一句话中,我最后添加了两个成语......
local a = {}
local b = {}
local c,d = (a~=nil) and 1 or 0, (a~=nil) and 1 or 0 -- prints "1 1"
local c,d = (a==nil) and 1 or 0, (a==nil) and 1 or 0 -- prints "0 0"
print(c,d)