Lua,如果声明成语

时间:2016-08-02 00:29:47

标签: lua

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"?

3 个答案:

答案 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)