Lua“”== true等于“”== false

时间:2013-10-11 13:05:22

标签: lua

我无法理解表达式""==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,但事实并非如此   对于Lua。只有明确的false或nil等同于false。什么时候   有疑问,明确条件,例如如果val == nil则...结束   除非该值实际上是布尔值。

的值如何等于truefalsenill

4 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:11)

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

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

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

回到示例,在代码中

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

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

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

看来,Lua使用==处理平等比较,并在控制结构(ifwhilefor等)中进行比较。

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

  

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

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

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

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

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

if "" then
    print "Hello world!"
end 

将打印Hello world!,因为空字符串与nilfalse不同,因此评估为真值。