为什么这不是语法错误?

如果我这样做:

(false true) 

正如我所料,它因语法错误而失败。 但如果我这样做:

 (false true) 

代码被执行,它抛弃第一个条件并返回第二个条件的结果。

这被视为错误还是function?

行结尾是可选的,因此在这种情况下,返回会导致解析器将其解释为以下内容:

 (false; true) 

评估为:

 (true) 

如果这些是方法调用,那么两者都将被评估,但只会发出最后一个。 例如:

 x = (p "hello" p "world" 2) 

这将输出“hello”和“world”,x将等于2

括号用于分组,换行符用作表达式分隔符。 所以,你在这里只是一组两个表达式。 没有什么可以拒绝的。

这很有用,因为这个众所周知的习语:

 def foo(bar = (bar_set = true; :baz)) if bar_set # optional argument was supplied end end 

Ruby中没有其他方法可以确定是否提供了可选参数。

基本上,这会产生副作用,例如在我的示例中指定变量或在@ 32bitkid的示例中打印到屏幕。 在你的例子中,没有副作用,这就是你无法看到实际发生的原因。

如果你有警告,Ruby可以给你一个警告。

 $VERBOSE = true def foo (false true) end 

给你

 (irb):3: warning: unused literal ignored 

在Ruby 1.9.1 patchlevel 378和Ruby 1.8.7 patchlevel 330中。

请参阅如何运行带有警告的所有Ruby脚本? 如何运行带有警告的所有Ruby脚本。