Ruby:“&&&return”vs“and return”

时间:2016-09-22 03:55:03

标签: ruby-on-rails ruby

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

这有什么区别?

1 个答案:

答案 0 :(得分:22)

结帐the difference between and and &&。在示例中,您提供的方法puts在没有任何问题的情况下调用它的参数,优先级的差异会改变它的解析方式。

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

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