Ruby的一个班轮“并返回”

时间:2014-07-04 19:48:01

标签: ruby styles return

我最近发现了一个我不太了解的Ruby问题。那么,有人可以向我解释为什么Ruby中的这两个以下语句不一样 -

puts "foo" and return if true

VS

if true
  puts "foo" 
  return 
end

1 个答案:

答案 0 :(得分:5)

要了解问题中的oneliner,您需要记住Ruby运算符及其优先级。或者更确切地说,Ruby语法。您需要以与Ruby解释器完全相同的方式查看语句。它必须成为你的第二天性。现在让我们来看看你的单行

puts "foo" and return if true

让我们先把无关的问题分开。关键字return仅适用于方法或lambdas,并不是您问题的主题。此外,尾随if true始终有效,因此似乎没有必要。要一般性地讨论您的问题,让我们定义方法#bar和变量baz

def bar
  puts "bar"
end

baz = true

让我们谈谈修改后的单行

puts "foo" and bar if baz

如果您已经记住了Ruby语法,那么您将能够像Ruby看到的那样对该行进行括号括起来:

( puts( "foo" ) and ( bar ) ) if ( baz )

跟踪if的行为类似于优先级非常低的运营商。只有if为真,才会执行从开头到baz的整行。因此,

puts "foo" and bar

被执行。括号如下:

puts( "foo" ) and ( bar )

您可以看到首先执行puts "foo",在屏幕上打印foo并返回nil。由于nil是假的,因此运算符and只返回它,而右侧的bar永远不会被执行。

至于

if baz
  puts "foo"
  bar
end

相当于:

( puts( "foo" ); bar ) if ( baz )

您可以看到差异:puts "foo"bar未加入and,但它们是独立的逻辑行。第一行的返回值被丢弃,不会影响第二行的执行。

最后,让我们看一下用and替换&&后会发生什么。因为&&运算符的优先级高于and,oneliner

puts "foo" && bar

变为

puts( "foo" && bar )

换句话说,"foo" && bar的值将首先计算,然后作为参数传递给#puts方法。由于字符串"foo"被认为是真实的,因此执行进行到bar,在屏幕上打印"bar"并返回nil。你可以自己尝试

的价值
"foo" && bar

nil,屏幕上印有"bar"作为副作用。

puts( "foo" && bar )

因此成为

puts( nil )

会导致在屏幕上打印空行。

士气是人们应该学习语法。 Ruby设计师迈出了一大步,使代码可以像书本一样轻松阅读。