我正在学习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
有人可以告诉我这些括号中的返回值的变化?
这是一种“块”的代码?
我正在学习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
有人可以告诉我这些括号中的返回值的变化?
这是一种“块”的代码?
它们是两种不同的陈述。
第一种是有条件分配:
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
这清楚地表明,该任务是什么是条件把守,被分配不仅仅是值。
操作过程中括号会改变优先级。 由于其状态为条件表达式,括号之间的代码将被评估为布尔值。像@Mark Reed说的那样,有不同的陈述。这取决于你打算使用正确的。希望它有帮助。 ;)
现在我明白了!谢谢Mark非常快速全面的回答:) – 2013-02-10 14:31:35