分號是 C 語言系列的標準分隔符號,一個 statement 的結束必須以分號為準,並不參考其他的東西(比如分行),這個原則其實很久就受到多方的挑戰,尤其是 script 語言。
我們常見的 script 語言除可使用分號當分隔符號外,大都也可使用分行當分隔符號(如:bash、DOS 的 bat 等)。基於 script 語言強調「簡易、方便」的處理原則,只要想要切入 script 應用的語言,都會考慮分行作為分隔的原則。
例如 JavaScript,他的語法屬於 C 系列(Java 承繼 C 的語法精神、JavaScript 承繼 Java 的語法精神),但 JavaScript 決定分號並不是唯一的分隔符號。在 JavaScript 中你仍然可以使用分號來結束一個 statement ,但只要在允許的範圍內,分號是可有可無的。
何謂允許的範圍?就是「JavaScript Engine 如果可以分辨出一個獨立的 statement」的狀況下,這種狀況最典型的就是分行,因此你若有分行分開兩個 statement,那個分號就已變成可有可無,沒有存在的必要,這時的分號是可以省略的。
Scala 的思想邏輯也是著重在簡單上,希望讓 Programmer 快速開發程式,因此自然有相同省略分號的思考邏輯。
在 Scala 中,只要可以省略分號的地方,你就可以省略,這就是「分號省略原則」。
當然,你若執意要保留分號,以便與 Java 程式碼看起來比較相像,也是可以,只是分號省略是 Scala 比較推薦的方式。
「什麼是只要可以省略分號的地方?」
大部分的 programmer 在一行只會寫下一個 statement,不同的 statement 寫在不同行是絕大多數人的習慣,所以 statement 與 statement 中間通常都會有分行符號,因此預測一個分行代表該行的 statement 的結束是合理的推論。依照這個推論,分行符號通常隱含著一個分號,所以 Scala 把分行當成可以省略分號的地方。
正常情況,Scala 會在行與行之前,偷偷加上分號,所以該行的 statement 會被結束。但下列情況的分行符號,Scala 不會進行偷偷加上分號的動作
1. 該行的命令尚未結束,比如在一個 infix operator 的 statement 中間,或是呼叫某個 object 的 method,但只寫到點「.」這個符號,此時不會自動補上分號。
2. 下一行的 statement 並不是一個正常 statement 的開頭,此時也不會自動在前一行補上分號。
3. 小括號與中括號內部的分行,也不會自動補上分號。
「除以上三點的情況,在一般分行符號加上分號」,這種動作就稱為分號推論「semicolon inference」。
我們來看以下的例子:
var n1: Int = 10; var n2: Int = 20;
我們可以改寫為
var n1: Int = 10 var n2: Int = 20
有沒有分號,兩者所代表的意義,都一模一樣。
沒有留言:
張貼留言