1



我正在学习红宝石,但遇到了可能很简单的问题。有代码:

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

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

4

2 回答 2

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总是会改变,无论如何;just的值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

这清楚地表明,分配是由条件保护的,而不仅仅是被分配的值。

于 2013-02-10T14:16:38.683 回答
0

括号将在操作过程中改变优先级。由于其作为条件表达式的状态,括号之间的代码将被评估为布尔值。就像@Mark Reed 所说,有不同的说法。使用正确的取决于您的意图。希望它有所帮助。;)

于 2013-09-12T15:12:00.693 回答