我尝试过类似的代码:
array = [1, 2, 3]
array.each do |i|
i == 1 ? puts "foo" : puts "bar"
end
但是语法错误说:
expecting keyword_do or '{' or '('
然后我尝试了这样的代码:
array = [1, 2, 3]
array.each do |i|
puts i == 1 ? "foo" : "bar"
end
并且有效。
为什么会出现这种错误?这是一个错误吗?
我发现https://bugs.ruby-lang.org/issues/10653有关三元运算符和块的错误,但我无法理解它。
我正在使用ruby 2.2.4
答案 0 :(得分:3)
这不是错误,而是操作符优先级问题
i == 1 ? puts "foo" : puts "bar"
以i == 1 ? puts("foo" : puts "bar")
的形式读取Ruby,这是没有意义的。这是因为方法调用在所有运算符中具有最低优先级
相反,你应该像i == 1 ? puts("foo") : puts("bar")
答案 1 :(得分:2)
看起来Ruby在评估这两个表达式时遇到了麻烦。
尝试将它们包装在括号中:
array = [1, 2, 3]
array.each do |i|
i == 1 ? (puts "foo") : (puts "bar")
end
应该有用。
答案 2 :(得分:0)
调用方法时使用括号:
array = [1, 2, 3]
array.each do |i|
i == 1 ? puts("foo") : puts("bar")
end
显式优于隐式