空白符包括:空格符、定位字元和分行符號,它們本身並不是標記,而是用於分隔不同的標記,以免這些標記合并成一個標記。
注意:
有時候的空白符是必須的,還有一些實際上是被禁止的。
1、作為語句終結符的分行符號
C和Java每個語句必須以分號結尾。在Ruby中,也可以用分號來終結語句,但這並不是必須的。只有當你試圖在一行代碼裡面放置多條語句時,才須要使用分號分隔它們。除此之外,依照慣例分號都是被省略掉的。
Ruby解譯器的智能:
在沒有顯式的分號結尾下,Ruby解譯器自己會找何處結尾。
如果一行Ruby代碼是一個句法完整的語句,那麼Ruby就將該行結尾的分行符號看成是此語名的終結符,否則Ruby將繼續解析下一行的語句,直到得到一個完整的語句。
有智能就會存在問題:
如果語句分布多行,就可能會被錯誤解釋。
total=x+
y
----------------------------------------
Ruby會正確解釋
但是如果是
total=x
+y
----------------------------------------
會被解釋成兩個運算式,total=x 將x的值賦給total,下行+y沒什麼意思,但是是完成的運算式。
return 和break語句可能會解釋不正確。
總結:
在以下幾種情況下可以放心換行
1)、一個操作符之後換入分行符號,如
puts x+
y
2)、在方法調用的句點之後插入分行符號
Foo.new.
say_hello
3)、在數組或雜湊表字面量裡,用於分隔各元素的逗號
[1,2,3] 或{x=>1,y=>1}
插入如下換行:
[1,
2,
3]
{x=>1,
y=>1}
以上兩種情況不會出現問題
4)、可以用一個"/"來對分行符號進行轉義,這樣就可以避免Ruby自動終結該語句了:
var total=first_long_variable_name+second_long_variable_name /
+third_long_variable_name # note no statement terminator above
在Ruby 1.9裡,關於語句終結符的規則發生了一點小變化:如果一行代碼的第一個非空白的字元是一個句點,那麼這一行將被當成上一行的延續,而且在該行語句之前的那個分行符號將不被當作語句終結符。
animals=Array.new
.push("dog") #ruby 1.8 中不行
.push("cow")
.push("cat")
.sort
2、空格符與方法調用
Ruby的文法允許在特定環境下與方法調用相關的圓括弧可以被省略,這使Ruby的方法使用起來就好象它們是語句一樣。
優雅性??
危害性??相輔相成
f(3+2)+1
f (3+2)+1
難道這兩者有區別?空格不被忽略
----------------------------------------
是有區別的在Ruby中, f(3+2)+1將(3+2)的結果5傳遞給方法f,然後結果上加1.
而f (3+2)+1則為:方法名後面有空格,在空格符之後出現的圓括弧括起來的運算式3+2,先計算,然後將(3+2)+1的結果傳給函數f
f(3+2)+1 =>相當於f(5)+1
f (3+2)+1 =>相當於f(6)
其中的區別,這樣說來就明顯了。
如果在執行代碼時使用 -w 參數開啟警告,Ruby將在它碰到具有二義性的代碼時發出警告。
解決方案:
× 永遠不要在方法名和其後的左圓括弧之間留白
× 如果一個方法的第一個參數以圓括弧開頭,那麼在此方法的調用中,請一直使用圓括弧,比如f((3+2)+1)
× 請一直使用Ruby解譯器的-w選項,這樣它就會在你忘記了上述規則時發出警告。