简化的脚本如下:
z1 = (12 -
2) / (5)
z2 = (12
- 2) / (5)
puts(z1.to_s + " " + z2.to_s)
给出了:
$ ruby rubytest.rb
2 -1
现在,我知道z1
案例是正确的方法,因为行尾的挂起操作符被解释为行的自动延续。
但是,我希望解释器在z2
情况下快速失败,并告诉我声明不完整,或者说它的第二行是荒谬的。但它处理它"很好"并给出" -1"回答。它是否因为不承认它而感到困惑,并希望废话的答案会被忽视?
有人可以解释z2
的评估实际发生了什么,为什么它是" -1",为什么没有语法错误,并且有一个例子,这种行为是有用的(或者我们应该提出删除它的请求吗?)
答案 0 :(得分:12)
这是一个功能,但你可能会认为这是一个错误。出于同样的原因,你可以做到这一点(很多情况都很方便):
(call_function_1; call_function_2) if some_condition
换行符的解释与;
相同。例如,您会注意到此计算结果正常,并且仅返回最后一个表达式,但所有表达式都被评估:
(1
2
3
4
5)
=> 5
与
相同(1; 2; 3; 4; 5)
=> 5
要查看所有表达式都已经过评估,您可以尝试这样做:
(puts "A"
puts "B"
puts "C"
123)
A
B
C
=> 123
所以你的例子变成了:
(12; -2) / 5
与以下内容相同:
-2 / 5
哪个是-1
。
要使Ruby将12
解释为未完成的语句而不是单独的语句,您可以通过添加行继续提示\
来告诉Ruby:
(12 \
- 2) / 5
=> 2