Ruby:“&& return”vs“返回”

在浏览http://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors的Rails指南时,我编写了一个测试程序来测试Ruby的&& return ,我得到了这个奇怪的行为:

 def test1 puts 'hello' && return puts 'world' end def test2 puts 'hello' and return puts 'world' end 

这是结果输出:

 irb(main):028:0> test1 => nil irb(main):029:0> test2 hello world => nil 

是什么原因造成的?

看看and&&之间的区别 。 在示例中,您给出的方法是调用puts而不是parens围绕它的参数,优先级的差异会改变它的解析方式。

在测试1中, &&优先级高于方法调用。 所以实际发生的是puts('hello' && return) 。 参数总是在它们被调用的方法之前被评估 – 所以我们首先评估'hello' && return 。 由于'hello'是真实的,因此布尔值不会短路并且会对return进行评估。 返回时,我们退出方法而不做任何其他操作:因此没有记录任何内容,并且第二行没有运行。

在测试2中and其优先级低于方法调用。 所以会发生什么是puts('hello') and returnputs方法记录传递给它的内容,然后返回nilnil是一个假值,因此表达式短路和return表达式永远不会被评估。 我们只是移动到第二行,即puts 'world'运行。