为什么这不是语法错误?

时间:2011-12-07 19:56:13

标签: ruby syntax

如果我这样做:

(false true)

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

(false
 true)

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

这被视为错误或功能吗?

3 个答案:

答案 0 :(得分:15)

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

(false; true)

评估为:

(true)

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

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

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

答案 1 :(得分:7)

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

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

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

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

基本上,这会产生副作用,例如在我的示例中指定变量或在@ 32bitkid的示例中打印到屏幕。在您的示例中,没有副作用,这就是为什么您无法看到实际正在进行的内容。

答案 2 :(得分:2)

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

$VERBOSE = true
def foo
  (false
   true)
end

给你

(irb):3: warning: unused literal ignored

在Ruby 1.9.1补丁级别378和Ruby 1.8.7补丁级别330中。

有关如何运行带有警告的所有Ruby脚本,请参阅How can I run all Ruby scripts with warnings?