Ruby:"&& return"vs"返回"

Spe*_*pec 15 ruby ruby-on-rails

在浏览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
Run Code Online (Sandbox Code Playgroud)

这是结果输出:

irb(main):028:0> test1
=> nil
irb(main):029:0> test2
hello
world
=> nil
Run Code Online (Sandbox Code Playgroud)

有什么区别?

小智 24

看看之间的区别and&&.在示例中,您给出的方法puts是在没有parens的情况下调用它的参数,优先级的差异会改变它的解析方式.

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

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

  • 解释得很好......我觉得我的支持和感谢对于您与我们分享的这部知识杰作来说还不够。 (2认同)