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 则 ... 结束 除非该值实际上是布尔值。
值如何不等于true
、false
或nill
?
【问题讨论】:
好吧,好像""
是一个空字符串。所以,它不是true
,不是false
,也不是nill
。
我不明白为什么应该这样做?
我认为问题是我假设字符串会有真值/假值。
@HennyH,但您引用的文档说他们没有。那你为什么还对它感到惊讶呢?
顺便说一下@HennyH,您通常使用Python,对吗? >>> ""==True False >>> ""==False False >>> ""==None False
:)
【参考方案1】:
当用作布尔值时,所有 Lua 值的计算结果都是 true,除了 nil 和 false。这并不意味着计算结果为 true 的值 等于 为 true。如果要将值 v
转换为布尔值,请使用 not not v
。
【讨论】:
【参考方案2】:""
的类型是字符串,而不是布尔值,因此它不等于 true
或 false
。
更一般地说,当 Lua 比较两个值时,它首先测试它们的类型,如果类型不匹配,Lua 立即认为这两个值不相等。
当用作控制表达式时,Lua 中唯一的假值是false
和nil
,其他的都被评估为真值。一些流行的混淆包括数字0
、空字符串""
、字符串"0"
,它们都是真值。再次注意false
和nil
不相等,因为它们是不同的类型。
回到例子,在代码中
if "" then -- if ""==true
print "was true"
end
Lua 测试 ""
是 false
还是 nil
,因为两者都不是,所以 Lua 将条件视为真值。
【讨论】:
这意味着lua对if "" then print "was true" end
的if "" then
部分(打印was true
)的解释与"" == true
不同。有没有规范。还是位置是区分这些上下文的来源?
@HennyH 当 Lua 看到if n
时,它会测试n
是否既不是false
也不是nil
。再次注意虽然false
和nil
都被视为假值,但它们也不相等。
啊,这更有意义。【参考方案3】:
免责声明:我没有使用 lua 的经验,这是有根据的猜测
这可能是因为 "" 是一个空字符串,所以 Lua 可能会将其评估为长度为零的字符串。由于它是一个有效的对象,它不会等于 true、false 或 nil,它将等于长度为零的字符串。
【讨论】:
【参考方案4】:免责声明:我对 Lua 的唯一了解就是我对 Lua 一无所知。
看起来 Lua 对使用 ==
的相等比较和在控制结构中完成的比较(if
、while
、for
等)的处理方式不同。
根据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!
,因为空字符串不同于nil
和false
,因此计算结果为真值。
【讨论】:
以上是关于Lua ""==true 等于 ""==false的主要内容,如果未能解决你的问题,请参考以下文章