在阅读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造成这种差异的原因是什么?
发布于 2016-09-22 12:30:10
查看the difference between and and &&。在您给出的示例中,调用方法puts时其参数周围没有括号,优先级的不同会改变它的解析方式。
在测试1中,&&的优先级高于方法调用。所以实际发生的是puts('hello' && return)。参数总是在调用它们的方法之前计算--所以我们首先计算'hello' && return。因为'hello'是真的,所以布尔值不会短路,并计算return。当返回时,我们退出方法而不做其他任何事情:所以不会记录任何东西,第二行也不会运行。
在测试2中,and的优先级低于方法调用。所以发生的是puts('hello') and return。puts方法记录传递给它的内容,然后返回nil。nil是一个假值,因此and表达式短路,return表达式永远不会求值。我们只需移动到运行puts 'world'的第二行。
https://stackoverflow.com/questions/39629976
复制相似问题