为什么括号内的换行符会改变算术结果?

Why do newlines within parenthesis change arithmetic results?

为什么以下表达式会这样解析?括号的优先级应该高于换行符,不是吗?

3 - ( 1 + 1 )
# => 1

3 - ( 1
     + 1 )
# => 2

省略加号也会让表达式计算为 2:

3 - ( 1
      1 )
# => 2

如果我声明为连续的换行符(转义)或将加号移动到第一行,则会实现所需的行为:

3 - ( 1 \
     + 1 )
# => 1

3 - ( 1 +
      1 )
# => 1

这是因为Ruby除非表达式不完整,否则将新行识别为表达式的结尾。例如,

(1
+ 1)

相同
(1;
+1)

+1 相同,因为返回了括号内的最后一个表达式。这与 1.

更进一步

当行尾有 + 时,表达式不完整,因此会继续到下一行。这使得:

3 - ( 1 +
      1 )

被解释为3 - (1 + 1)

如果括号中有代码,那么如果您不以 \ 结尾或不以数学运算符开始新的代码行,那么每一行都将作为单独的代码行受到威胁。

所以在你的例子中:

def plus_minus_if_you_understand_this_the_problem_is_solved_i_guess 
    3 - (1
         1 )
end

表示我有数字 3 并且想减去括号中的表达式。在括号中我有第 1 行编号 1 和第 2 行编号 1 并且因为它是表达式的最后一行它被 Ruby 重新调整(就像在 def 最后返回 end 之前的项目。因此:

( 3   # doing nothing
  1 ) # returns 1

也请看下面。同样,这部分代码 returns 2 因为它是括号中的最后一项:

( puts "hello!"
  2 ) => 2