bro*_*web 1 ruby conditional-operator
我尝试使用简写来获得基于子字符串存在的响应,而不是预期的字符串响应,它被评估为"假".在我的第二个更简单的例子中,打印了期望字符串.
#fails
puts "test".include? "s" ? "yep" : "nope"
Run Code Online (Sandbox Code Playgroud)
#成功
puts 1>2 ? "1 is greater than 2" : "1 is not greater than 2"
Run Code Online (Sandbox Code Playgroud)
这是一个优先问题.
你需要 :
puts "test".include?("s") ? "yep" : "nope"
#=> yep
Run Code Online (Sandbox Code Playgroud)
不带括号的方法调用位于优先级表之间defined?和之间or,因此它低于三元运算符.这意味着
puts "test".include? "s" ? "yep" : "nope"
Run Code Online (Sandbox Code Playgroud)
被解析为
puts "test".include?("s" ? "yep" : "nope")
Run Code Online (Sandbox Code Playgroud)
是的
puts "test".include?("yep")
Run Code Online (Sandbox Code Playgroud)
是的
false
Run Code Online (Sandbox Code Playgroud)
"s" ? "yep" : "nope"
Run Code Online (Sandbox Code Playgroud)
显示警告:
warning: string literal in condition
Run Code Online (Sandbox Code Playgroud)
因为三元运算符需要一个布尔值,而String总是很简单.
这是有效的原因
puts 1>2 ? "1 is greater than 2" : "1 is not greater than 2"
Run Code Online (Sandbox Code Playgroud)
是三元运算符的优先级高于put:
puts ( 1>2 ? "1 is greater than 2" : "1 is not greater than 2" )
Run Code Online (Sandbox Code Playgroud)
评估为:
puts ( "1 is not greater than 2" )
Run Code Online (Sandbox Code Playgroud)
如果您有优先级问题,使用puts不带括号可能只会使问题变得更糟.您可以启动IRB并直接查看结果.
这是一个例子:
# in a script :
puts [1,2,3].map do |i|
i * 2
end
#=> #<Enumerator:0x0000000214d708>
Run Code Online (Sandbox Code Playgroud)
IRB:
[1,2,3].map do |i|
i * 2
end
# => [2, 4, 6]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35 次 |
| 最近记录: |