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
,这令人困惑。@jjmdo
是有效的块语法,任何方法都可以传递一个块,它可能永远不会调用或产生。解析器不会进行这种区分,因此它会使用所有可能有效的选项来修复语法错误关键字\u do或“{”或“(“
啊,你说得对。这也是三元结构非常混乱的情况。在进行方法调用时,使用适当的if
来打破逻辑并使其非常清晰。