我正在学习红宝石,但遇到了可能很简单的问题。有代码:
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
有人能告诉我这些括号在返回值上有什么变化吗?
它是一种代码“块”吗?
我正在学习红宝石,但遇到了可能很简单的问题。有代码:
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
有人能告诉我这些括号在返回值上有什么变化吗?
它是一种代码“块”吗?
它们是两种不同的说法。
第一个是条件赋值:
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
这清楚地表明,分配是由条件保护的,而不仅仅是被分配的值。
括号将在操作过程中改变优先级。由于其作为条件表达式的状态,括号之间的代码将被评估为布尔值。就像@Mark Reed 所说,有不同的说法。使用正确的取决于您的意图。希望它有所帮助。;)