为什么使用 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"
我试图使用 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"