涉及块和三元运算符的奇怪语法错误

时间:2016-03-31 20:34:52

标签: ruby block ternary-operator

我尝试过类似的代码:

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

3 个答案:

答案 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
  

显式优于隐式