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中,只有falsenil被视为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