Ruby:为什么 =~ 在 if 语句中求值为真?
Ruby: why does =~ evaluate to true in an if statement?
我正在学习 Ruby 并且已经看到(并使用)正则表达式匹配方式:
a = "string9"
if a =~ /\d/
#do something
end
该代码可以工作,但今天我阅读了有关 Regex 的文档,了解到 =~ returns 匹配项在字符串中的位置,如果不匹配则为 nil。我认为 =~ returns true 或 false 当它是 === 时 returns true 匹配,false 不匹配。看来上面代码中的if语句应该改写一下:
if /\d/ === a
我都试过了,程序 运行 不会出错。我只是想了解发生了什么。似乎 "if" 会将除 "nil" 之外的任何内容都视为 true。我想我的问题不是关于正则表达式,而是关于 if 语句(和其他布尔语句)如何工作。
if
之后的谓词将被视为布尔值。
在Ruby中,只有false
和nil
被视为false
。其他任何东西都将被评估为 true
,因此 0
、[]
、{}
在布尔上下文中都是 true
。
来自 Ruby doc:
nil and false are both false values. nil is sometimes used to indicate "no value" or "unknown" but evaluates to false in conditional expressions.
true is a true value. All objects except nil and false evaluate to a true value in conditional expressions.
你可以看看 the control expressions。
我正在学习 Ruby 并且已经看到(并使用)正则表达式匹配方式:
a = "string9"
if a =~ /\d/
#do something
end
该代码可以工作,但今天我阅读了有关 Regex 的文档,了解到 =~ returns 匹配项在字符串中的位置,如果不匹配则为 nil。我认为 =~ returns true 或 false 当它是 === 时 returns true 匹配,false 不匹配。看来上面代码中的if语句应该改写一下:
if /\d/ === a
我都试过了,程序 运行 不会出错。我只是想了解发生了什么。似乎 "if" 会将除 "nil" 之外的任何内容都视为 true。我想我的问题不是关于正则表达式,而是关于 if 语句(和其他布尔语句)如何工作。
if
之后的谓词将被视为布尔值。
在Ruby中,只有false
和nil
被视为false
。其他任何东西都将被评估为 true
,因此 0
、[]
、{}
在布尔上下文中都是 true
。
来自 Ruby doc:
nil and false are both false values. nil is sometimes used to indicate "no value" or "unknown" but evaluates to false in conditional expressions.
true is a true value. All objects except nil and false evaluate to a true value in conditional expressions.
你可以看看 the control expressions。