2013-02-10 44 views
1



我正在学习ruby,并且遇到了可能的简单问题。还有就是代码:为什么括号会改变返回值?

str = 'abc' 
a = 1 
b = 2 
a = str.reverse if str.size > 3 
b = (str.reverse if str.size > 3) 
p a 
p b 

输出:

1 
nil 

有人可以告诉我这些括号中的返回值的变化?
这是一种“块”的代码?

回答

7

它们是两种不同的陈述。

第一种是有条件分配:

a = str.reverse if str.size > 3 

if适用于整条生产线。如果str.size不大于3,那么绝对没有任何反应; a根本没有触及。你也可以写这样说:

if str.size > 3 then 
    a = str.reverse 
end 

如果能够坚持在if上刚刚结束,您可以在一个行,而不是块做。

第二个是一个条件值的分配。

b = (str.reverse if str.size > 3) 

无论如何,b的值都会随时改变; str.size的值只是确定它将更改为。你也可以使用的if的块状这里:

b = if str.size > 3 then 
    str.reverse 
end 

最重要的区别是,分配给b发生在if之外,所以它不是条件;它总是发生。

圆括号不会创建块,但它们确实确定优先级。只要你有一个可以用多种方式解释的陈述取决于事情发生的顺序,实际发生的事情是由优先规则决定的。举例来说,标准的运算规则告诉我们,这是真的:

3 + 2 × 4 = 11 

答案不是20,因为乘法的优先级高于加法。圆括号让你改变它;以上是相当于

3 + (2 × 4) = 11 

,如果你想要的答案是20,那么你可以写这个:

(3 + 2) × 4 = 20 

同样的事情会为Ruby。如果没有括号,第一行就相当于这个括号中的版本:

(a = str.reverse) if str.size > 3 

这清楚地表明,该任务是什么是条件把守,被分配不仅仅是值。

+0

现在我明白了!谢谢Mark非常快速全面的回答:) – 2013-02-10 14:31:35

0

操作过程中括号会改变优先级。 由于其状态为条件表达式,括号之间的代码将被评估为布尔值。像@Mark Reed说的那样,有不同的陈述。这取决于你打算使用正确的。希望它有帮助。 ;)

相关问题