如果我这样做:
(false true)
它因语法错误而失败,正如我所料。但如果我这样做:
(false
true)
执行代码,它抛弃第一个条件并返回第二个条件的结果。
这被视为错误或功能吗?
答案 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)
$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?。