Ruby - 语句中的错误换行仍会给出结果吗?

时间:2014-12-13 22:25:49

标签: ruby syntax syntax-error line-breaks multiline

简化的脚本如下:

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",为什么没有语法错误,并且有一个例子,这种行为是有用的(或者我们应该提出删除它的请求吗?)

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