我最近发现了一个我不太了解的Ruby问题。那么,有人可以向我解释为什么Ruby中的这两个以下语句不一样 -
puts "foo" and return if true
VS
if true
puts "foo"
return
end
答案 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设计师迈出了一大步,使代码可以像书本一样轻松阅读。