Sunday, October 12, 2008

(6)Ruby中的“空白”

“空格”、“制表符”以及“换行符”不是具体的符号,但是他们实际上是存在的,Ruby中通常会忽略他们,他们的存在一般是为了格式化代码,是代码看起来更加容易阅读。但是有的时候增加或者删除一个“空白”,会改变程序的含义,这虽然不常发生但是仍然非常重要。
通常情况下在Ruby中一个新的开始意味着上一行语句的结束,在类似C和Java这样的语言中通常一个语句的结束是通过分号表示的,在Ruby中你也可以这样做,但是这不是必须的除非你想在一行中写多个语句。在没有通过分号明确的结束一个语句的情况下,Ruby会判断这一行代码是非从语义上已经结束了,如果没有它会接着解析下一行,比如下面的例子:

x=1
y=3
total=x+
y
puts total #打印的结果为x+y的合计值


x=1
y=3
total=x
+y #这一行是不参与计算的
puts total #打印的结果为x的值

另外要注意的一点是当Ruby遇到break和return关键字的时候则意味着关键字之前的语句已经结束。当然,return是可选的,Ruby认为方法的最后一行就是它的返回值。
你还可以利用反斜杠来避免一行语句的结束,比如:
var total = first_long_variable_name + second_long_variable_name \
+ third_long_variable_name # 注意上一行语句并没有结束

在Ruby1.9中语句结束的规则有一个小小的改变,比如下面的例子中如果你写出一个方法的链式调用,即每个方法以句点开头,这是允许的:
animals = Array.new
.push("dog") # Ruby 1.8不支持此语法结构
.push("cow")
.push("cat")
.sort

说完了换行符号,我们再来看看空格,Ruby中运行在方法后使用括号()来进行方法调用和参数传递,你也可以不使用括号,这是Ruby语言设计上的高明之处,但是这也同样带来了一个致命的“空白”问题,比如下面的例子:
f(3+2)+1
f (3+2)+1

第一行是给方法f传递一个参数3+2并且将结果与1相加,但是第二行中,方法f后面加了一个空格,结果变成了给方法f传递一个参数(3+2)+1 即6,这显然是不对的,如果你通过ruby -w 的方式运行程序你会看到Ruby提示这段代码存在语法混淆的警告。解决这种错误的方法是:
  • 不要再方法名和括号之间加空格。
  • 如果方法的第一个参数一定要包含于一对括号中,那么把所有的参数都用一个大的括号包含起来,比如f((3+2)+1)
  • 总是通过ruby -w 的方式打开警告开关选项,以便在出现语法混淆的时候给出警告。

No comments: