Ruby - 语句中不正确的换行符仍然会给出结果吗?

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

最佳答案

这是一项功能,但您一开始可能会认为这是一个错误。出于同样的原因,您可以这样做(在很多情况下这很方便):

(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

关于Ruby - 语句中不正确的换行符仍然会给出结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27464275/

相关文章:

ruby - log4r 示例的系统日志输出

ruby - 如何使用 Padrino 在运行方法中设置 WEBRick 选项参数

syntax - === 运算符在 Kotlin 中的作用是什么?

mysql - 错误 1064 MySQL 错误

ruby - 限制未运行的方法语法

r - 在R Studio中对日期时间格式应用条件时无法获取数据

ruby - 从嵌套数组中删除重复项

ruby - Vpim::Vcard - 解析 vcard 2.1

php - ajax,语法错误: unexpected token A in json at position 0

mysql - 如何在mysql中创建存储过程?