为什么使用 shorthand "if" 语法在使用 "include?" 搜索子字符串时不计算

Why does using the shorthand "if" syntax does not evaluate when searching for a sub-string using "include?"

我试图使用 shorthand 来根据子字符串的存在获得响应,而不是预期的字符串响应,它评估为 "false." 在我的第二个更简单的示例中期望字符串被打印出来。

#fails

puts "test".include? "s" ? "yep" : "nope" 

#成功

puts 1>2 ? "1 is greater than 2" : "1 is not greater than 2"

这是一个 precedence 问题。

解决方案

你需要:

puts "test".include?("s") ? "yep" : "nope"
#=> yep

为什么?

不带括号的方法调用在优先级table中介于defined?or之间,因此低于三元运算符。这意味着

puts "test".include? "s" ? "yep" : "nope"

被解析为

puts "test".include?("s" ? "yep" : "nope")

也就是

puts "test".include?("yep")

也就是

false

警告

"s" ? "yep" : "nope"

显示警告:

warning: string literal in condition

因为三元运算符需要一个布尔值,而字符串始终为真。

1 > 2

之所以有效

puts 1>2 ? "1 is greater than 2" : "1 is not greater than 2"

是三元运算符的优先级比puts高:

puts ( 1>2 ? "1 is greater than 2" : "1 is not greater than 2" )

评价为:

puts ( "1 is not greater than 2" )

最后一个提示

当你遇到优先级问题时,使用不带括号的 puts 可能只会让问题变得更糟。你可以启动IRB,直接看看结果是什么。

这是一个例子:

# in a script :
puts [1,2,3].map do |i|
  i * 2
end
#=> #<Enumerator:0x0000000214d708>

内部评级委员会:

[1,2,3].map do |i|
  i * 2
end
# => [2, 4, 6]

看起来 ruby 在没有一点帮助的情况下无法像您期望的那样解析它。它认为你在做

puts "test".include?("s" ? "yep" : "nope")

您需要在参数周围使用(可选的)括号

puts "test".include?("s") ? "yep" : "nope"

或者强制将测试表达式作为一个整体来解释:

puts ("test".include?"s") ? "yep" : "nope"