我无法理解表达式""==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则...结束 除非该值实际上是布尔值。
不的值如何等于true
,false
或nill
?
答案 0 :(得分:24)
当用作布尔值时,所有Lua值都计算为true,除了nil和false。这并不意味着评估为true的值等于为true。如果要将值v
转换为布尔值,请使用not not v
。
答案 1 :(得分:11)
""
的类型是字符串,而不是布尔值,因此它不等于true
或false
。
更一般地说,当Lua比较两个值时,它首先测试它们的类型,如果类型不匹配,Lua认为这两个值不是立即相等。
当用作控制表达式时,Lua中唯一的错误值是false
和nil
,其他所有值都被评估为真值。一些流行的混淆包括数字0
,空字符串""
,字符串"0"
,它们都是真值。请再次注意,false
和nil
不相同,因为它们的类型不同。
回到示例,在代码中
if "" then -- if ""==true
print "was true"
end
Lua测试""
是false
还是nil
,因为它既不是,所以Lua将条件视为真值。
答案 2 :(得分:4)
免责声明:我对lua没有经验,这是一个有根据的猜测
这可能是因为“”是一个空字符串,所以Lua可能会将它评估为长度为零的字符串。由于它是一个有效的对象,它不会等于true,false或nil,它将等于长度为零的字符串。
答案 3 :(得分:1)
免责声明:我对Lua唯一了解的是我对Lua一无所知。
看来,Lua使用==
处理平等比较,并在控制结构(if
,while
,for
等)中进行比较。
根据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!
,因为空字符串与nil
和false
不同,因此评估为真值。