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

Ruby 涉及块和三元运算符的奇怪语法错误,ruby,block,ternary-operator,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 它成功了 为什么会出现这种错误?那是虫子吗 我发现了一个关于三元运

我尝试过类似的代码:

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
它成功了

为什么会出现这种错误?那是虫子吗

我发现了一个关于三元运算符和一个块的bug,但我不太懂


我正在使用ruby 2.2.4,看起来ruby在计算这两个表达式时遇到了问题

尝试将它们括在括号中:

array = [1, 2, 3]
array.each do |i|
  i == 1 ? (puts "foo") : (puts "bar")
end

哪个应该有效。

调用方法时使用括号:

array = [1, 2, 3]
array.each do |i|
  i == 1 ? puts("foo") : puts("bar")
end
显性比隐性好


这不是错误,而是运算符优先级问题
i==1?puts“foo”:puts“bar”
读取Ruby为
i==1?puts(“foo”:puts“bar”)
这毫无意义。这是因为方法调用在所有运算符中具有最低的优先级


相反,您应该自己放括号,如
i==1?puts(“foo”):puts(“bar”)

这绝对是您看到的bug。看起来这是2.2中引入的回归。对于“真实”代码,只需使用后者——三元运算符在用于赋值时比用于控制流时更为惯用。@jjm这不是一个错误,它与ruby允许省略方法调用的括号有关,但只有当它们是行中的最后一项时才如此。因为三元是内联的,所以您必须更改为
i==1?puts(“foo”):puts(“bar”)
说第二个是干燥剂。否则,解释器会试图处理
put(“foo”:put“bar”)
,这是无效的语法。@engineersmnky好的,你是对的-如果没有paren,语法总是假的。错误在于它报告了一个缺少的
do
,这令人困惑。@jjm
do
是有效的块语法,任何方法都可以传递一个块,它可能永远不会
调用
产生
。解析器不会进行这种区分,因此它会使用所有可能有效的选项来修复语法错误
关键字\u do或“{”或“(“
啊,你说得对。这也是三元结构非常混乱的情况。在进行方法调用时,使用适当的
if
来打破逻辑并使其非常清晰。