我最近发现了一个Ruby陷阱,但我并不完全理解。那么,有人能向我解释为什么以下两个Ruby语句不同吗-
puts "foo" and return if true
VS
if true
puts "foo"
return
end
要理解像你的问题中这种一行代码,你需要记住Ruby运算符及其优先级。更确切地说,是Ruby语法。你需要以与Ruby解释器完全相同的方式查看语句。它必须成为你的第二天性。现在让我们来看看你的一行代码。
puts "foo" and return if true
return
仅适用于方法或lambda中,并不是您问题的主题。此外,尾随的if true
始终有效,因此似乎是不必要的。为了总体讨论您的问题,我们定义方法#bar
和变量baz
。def bar
puts "bar"
end
baz = true
puts "foo" and bar if baz
( puts( "foo" ) and ( bar ) ) if ( baz )
尾随的 if
表现得像一个优先级非常低的运算符。仅当变量 baz
为真值时,从开头到 if
的整行代码才会被执行。在这种情况下,条件成立,因此整行代码都会被执行。
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
优先级高得多,所以这是一个单行程序。puts "foo" && bar
变成
puts( "foo" && bar )
"foo" && bar
的值将首先计算,然后作为参数传递给 #puts
方法。因为字符串 "foo"
被认为是真值,所以执行继续到 bar
,它在屏幕上打印出 "bar"
并返回 nil
。你可以自己尝试一下,验证其结果。"foo" && bar
这段代码中,nil
表示一个空值,在屏幕上会打印出一个副作用为 "bar"
的信息。
puts( "foo" && bar )
puts( nil )
这会导致屏幕上打印出一个空行。
结论是,我们应该学习语法。Ruby的设计者采取了重要措施,使代码像书一样易读。