【问题标题】:Why do newlines within parenthesis change arithmetic results?为什么括号内的换行符会改变算术结果?
【发布时间】:2016-02-29 19:03:35
【问题描述】:
为什么以下表达式会以它们的方式解析?括号应该比换行具有更高的优先级,不是吗?
3 - ( 1 + 1 )
# => 1
3 - ( 1
+ 1 )
# => 2
省略加号也会让表达式计算为2:
3 - ( 1
1 )
# => 2
如果我声明为连续换行符(转义)或将加号移到第一行,则达到预期的行为:
3 - ( 1 \
+ 1 )
# => 1
3 - ( 1 +
1 )
# => 1
【问题讨论】:
标签:
ruby
operators
newline
【解决方案1】:
这是因为 Ruby 将换行识别为表达式的结尾,除非表达式不完整。例如,
(1
+ 1)
与
相同
(1;
+1)
这与+1 相同,因为返回了括号内的最后一个表达式。这与1 进一步相同。
当您在行尾有+ 时,表达式不完整,因此会继续到下一行。这使得:
3 - ( 1 +
1 )
被解释为3 - (1 + 1)。
【解决方案2】:
如果括号中有代码,那么如果您不以 \ 结尾或使用数学运算符开始新的代码行,那么每一行都将作为单独的代码行受到威胁。
所以在你的例子中:
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
还请看下面。同样,这部分代码返回2,因为它是括号中的最后一项:
( puts "hello!"
2 ) => 2