Lua,if语句惯用法

local a = {}
local b = {}

local c,d = (a~=nil) and 1,1 or 0,0 -- 输出 "1 1"

local c,d = (a==nil) and 1,1 or 0,0 -- 输出 "false 1"

print(c,d)

我知道为什么会这样。有没有办法输出 "0 0"?

点赞
用户1442917
用户1442917

有没有办法打印"0 0"?

没有,因为 andor 表达式总是返回一个结果,而你看到的结果可能不是因为你想的那个原因。

local c,d = (a~=nil) and 1,1 or 0,0 -- 打印"1 1"

这是计算为((a~=nil) and 1),(1 or 0),0。第一个表达式返回1,第二个(1 or 0)返回1,最后一个被忽略了(因为左边有两个变量,右边有三个表达式)。

local c,d = (a==nil) and 1,1 or 0,0 -- 打印"false 1"

这是以类似的方式计算出来的,除了(a==nil)false,这就是你得到第二个结果的原因。

要做你想要的事,你需要将它分为两个表达式:一个为 c,一个为 d

2016-08-02 00:37:20
用户6101071
用户6101071

如在 "Paul Kulchenko" 的最后一句中指出的那样,我最终权衡了两个习语...

local a = {}
local b = {}

local c,d = (a~=nil) and 1 or 0, (a~=nil) and 1 or 0 -- 输出 "1 1"

local c,d = (a==nil) and 1 or 0, (a==nil) and 1 or 0 -- 输出 "0 0"

print(c,d)
2016-08-02 00:58:48
用户734069
用户734069

如果您真的希望以最紧凑的方式执行此操作,可以创建一个函数来执行。我通常只需要针对每个条件传递一个参数,但如果您确实需要处理多个参数的情况,则有两种方法。

选项#1:使用表格:

函数iff(cond, tbl1,tbl2)
  如果(cond)则
    返回unpack(tbl1)
  else
    返回unpack(tbl2)
  end
end

显然,这要求您始终传递表格。如果您只需要单个值,则需要该函数的第二个版本。这比基于类型添加条件逻辑更可取,从而减慢代码的速度。

选项#2:可变数量:

- 参数数量应该是偶数。
- 如果条件为true,则返回前一半,
- 如果条件为false,则返回后一半。
函数iff(cond,...)
  如果(cond)则
    返回...-是的,您将返回所有这些,但用户不应该尝试获取超过前半部分的内容。
  else
    返回select((select(“#”,...))/ 2,...)
  end
end
2016-08-02 02:27:22