1. class 宣告
2. object 宣告
3. 變數 / 常數 與 data field 宣告
4. method 宣告
接下來我們開始討論 Scala 語言的第二個部份「控制語法」。
Scala 承繼命令式語言的方式,所以 method 的執行是一個個 statement 照順序執行,直到遇到一些特殊情況,這個特殊情況就是我們要討論的控制結構(Control Structures)。
所謂「控制結構」是因為這些 structure 可以改變程式原有的順序式的執行方式,有控制程式執行的能力,因此稱「控制結構(Control Structures)」。
Scala 的 Control Structures 不多,只包含 if, while, for, try, match ,以及 method 呼叫。
「這些就夠了嗎?」
確實,是足夠了,雖然看起來不多,但由於 Scala 有一些特殊的語法,所以用起來一點也不會輸其他的語言。
尤其因為 Scala 可以使用 function literal(函數常數),所以我們很容易組成一個功能,而這樣的功能在其他語言可能需要引進一個新的語法,才可做到。
我們舉一個最新的例子,Java 7(撰寫本篇文章之時,Java 7 尚未正式發表) 引進一個新的語法 try-with-resource,我們可以看在 Scala 有什麼不一樣的方式。
我們先說明一下 try-with-resource 的需要原因。我們常常在程式中 open 一個 resource,然後使用它,最後把它 close。try-with-resource 讓 programmer 很方便使用 resource,程式完成後會自動 close 相對應的 resource。如下:
try (Resource resource = new Resource()) { use resouce... }
這種回收 resource 的機制,在 Java 需要語法支援。在 Scala 可不需語法的支援,我們隨時可以自己增加。
由於尚有許多東西未介紹,這裡尚不仔細討論作法,未來再詳細介紹。大概的作法如下
def try_resource(resource: Resource, code_block: Function) { //先定義 try_resource method,以後我們呼叫本 method,達到 try_resource 的功能 //code_block 是第二個參數,在呼叫本 method 時,傳進來一段程式碼 try { code_block(resource) //將 resource 丟給 code_block 當參數,然後執行 code_block } finally { resource.close() } } //以下為呼叫 try_resource 的方式 try_resource(new Resource()){resource => //resource 當成本 code_block的參數 read_resource(resource) }請先不要計較上例的語法,上例程式不是正確的程式, 由於有太多東西各位尚未清楚,這裡使用類虛擬碼的方式介紹。
上例呼叫 try_resource 的方式是,傳入一個 resource 當第一個參數,傳入一個 code_block 當第二個參數。
code_block 的寫法,是直接將 一段程式使用大括號括起來,這段括起來的程式碼,就可以傳進去 try_resource 當第二個參數。這種大括號括起來的一段程式碼,就是 function literal(函數常數)。
我們創造的 try_resource 與 Java 7 的 try-resource statement 用法相當類似,Java 7 需要語法支援,在 Scala 卻由我們自行創造,這其中的重要因素就是 function literal。
有了 function literal,我們可以直接將一段大括號括起的程式碼,當成參數傳給我們創造的 method,這時使用起來的感覺,很像是新的一個語法。
有了 function literal,我們可以很容易創造新的使用方法,所以雖然 Scala 的 Control Structures 比起其他語言少,但功能絕對有過之。
Scala 的語言組成份子很精簡,但容易擴充,我們若熟悉 Scala 的組成份子,未來可以針對不同的領域,設計我們的特殊「語法」,這就叫 DSL (Domain Specific Language)。
接下來章節,我們將一個個介紹 control structures,也會指出各位該注意的地方。
沒有留言:
張貼留言