Lua ""==true 等于 ""==false

Posted

技术标签:

【中文标题】Lua ""==true 等于 ""==false【英文标题】:Lua ""==true equals ""==false 【发布时间】:2013-10-19 13:53:23 【问题描述】:

我无法理解表达式 ""==true""==false 如何计算为 false

在 lua 解释器和 ilua 中尝试以下操作会得到相同的输出:

> =""==true
false
> =""==false
false

或者执行以下操作:

print(""==true)
print(""==false)
print(""==nil)

输出

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
false
false
false
> 

另一个例子:

> =""~=true
true
> =""==false
false

当以下代码运行时:

if "" then -- if ""==true
    print "was true"
end 

if not "" then -- if ""==false
    print "was not true"
end 

输出是(似乎不一致)

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
was true
> 

正如预期的 Lua 常见问题解答所述

类 C 语言认为 0 等价于 false,但事实并非如此 为卢亚。只有显式的 false 或 nil 等效于 false。什么时候 如有疑问,请明确条件,例如如果 val == nil 则 ... 结束 除非该值实际上是布尔值。

值如何等于truefalsenill

【问题讨论】:

好吧,好像"" 是一个空字符串。所以,它不是true,不是false,也不是nill 我不明白为什么应该这样做? 我认为问题是我假设字符串会有真值/假值。 @HennyH,但您引用的文档说他们没有。那你为什么还对它感到惊讶呢? 顺便说一下@HennyH,您通常使用Python,对吗? >>> ""==True False >>> ""==False False >>> ""==None False :) 【参考方案1】:

当用作布尔值时,所有 Lua 值的计算结果都是 true,除了 nil 和 false。这并不意味着计算结果为 true 的值 等于 为 true。如果要将值 v 转换为布尔值,请使用 not not v

【讨论】:

【参考方案2】:

"" 的类型是字符串,而不是布尔值,因此它不等于 truefalse

更一般地说,当 Lua 比较两个值时,它首先测试它们的类型,如果类型不匹配,Lua 立即认为这两个值不相等。

当用作控制表达式时,Lua 中唯一的假值是falsenil,其他的都被评估为真值。一些流行的混淆包括数字0、空字符串""、字符串"0",它们都是真值。再次注意falsenil 不相等,因为它们是不同的类型。

回到例子,在代码中

if "" then -- if ""==true
    print "was true"
end 

Lua 测试 ""false 还是 nil,因为两者都不是,所以 Lua 将条件视为真值。

【讨论】:

这意味着lua对if "" then print "was true" endif "" then部分(打印was true)的解释与"" == true不同。有没有规范。还是位置是区分这些上下文的来源? @HennyH 当 Lua 看到if n 时,它会测试n 是否既不是false 也不是nil。再次注意虽然falsenil 都被视为假值,但它们也不相等。 啊,这更有意义。【参考方案3】:

免责声明:我没有使用 lua 的经验,这是有根据的猜测

这可能是因为 "" 是一个空字符串,所以 Lua 可能会将其评估为长度为零的字符串。由于它是一个有效的对象,它不会等于 true、false 或 nil,它将等于长度为零的字符串。

【讨论】:

【参考方案4】:

免责声明:我对 Lua 的唯一了解就是我对 Lua 一无所知。

看起来 Lua 对使用 == 的相等比较和在控制结构中完成的比较(ifwhilefor 等)的处理方式不同。

根据Lua 5.1 manual (section 2.4.4, Control Structures),

控制结构的条件表达式可以返回任何值。 false 和 nil 都被认为是 false。所有不同于 nil 的值 和 false 被认为是真的(特别是数字 0 和 空字符串也是如此)。

这似乎与您所看到的一致。那就是:

"" == false => false
"" == true => false
"" == nil => false

因为比较运算符似乎在检查类型和值。

但是,如果您在控制结构中的条件中使用变量,则行为会略有不同。也就是说,

if "" then
    print "Hello world!"
end 

将打印Hello world!,因为空字符串不同于nilfalse,因此计算结果为真值。

【讨论】:

以上是关于Lua ""==true 等于 ""==false的主要内容,如果未能解决你的问题,请参考以下文章

Lua 中的内联条件(a == b ?“是”:“否”)?

Lua 中怎么变换数据类型?

改善数字小游戏

查询价格大于或等于"超级本"价格的商品,并且按价格降序排列

cocos2d-x 3.2 lua 怎样加载plist文件

如果 webdriver 的 headless 等于 True,我如何执行“scrollIntoView()”函数?