我正在学习红宝石,我遇到了可能的简单问题。有代码:
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
有人可以告诉我这些括号在返回值上有什么变化吗?
它是代码的“块”吗?
答案 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所说,有不同的陈述。并且您打算使用正确的。希望它有所帮助。 ;)