9

我无法理解表达式""==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 FAQ 声明

类 C 语言将 0 视为等价于 false,但对于 Lua 而言并非如此。只有显式的 false 或 nil 等效于 false。如有疑问,请明确条件,例如 if val == nil then ... end 除非该值实际上是布尔值。

一个值怎么可能等于true,falsenill

4

4 回答 4

27

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

于 2013-10-11T13:17:21.153 回答
12

的类型""是字符串,而不是布尔值,所以它不等于trueor false

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

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

回到例子,在代码中

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

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

于 2013-10-11T13:12:02.867 回答
4

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

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

于 2013-10-11T13:08:39.673 回答
2

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

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

根据Lua 5.1 手册(第 2.4.4 节,控制结构)

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

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

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

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

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

if "" then
    print "Hello world!"
end 

将打印Hello world!,因为空字符串nil与 and不同false,因此计算为真值。

于 2013-10-11T13:28:08.923 回答