为什么括号会改变返回值?

时间:2013-02-10 14:14:15

标签: 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

有人可以告诉我这些括号在返回值上有什么变化吗?
它是代码的“块”吗?

2 个答案:

答案 0 :(得分: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

清楚地表明赋值是由条件保护的,而不仅仅是赋值。

答案 1 :(得分:0)

括号将在操作期间更改优先级。 由于其状态为条件表达式,括号内的代码将被计算为布尔值。 就像@Mark Reed所说,有不同的陈述。并且您打算使用正确的。希望它有所帮助。 ;)