Scala:數字是物件,函式也是物件!

2gua發表於2013-01-19

在Scala中,一切皆物件!比Java的物件導向理念還徹底!
Scala裡,數字是物件,函式也是物件!

數字是物件
比如:1 + 2 * 3 / 2,和下面這個是一樣的:
(1).+(((2).*(3))./(2))

enter image description here

可以看出,“+”,“-”,“*”,“/”在Scala中同樣是有效的名稱。
在第二個表示式中的這些括號是必須的,因為 Scala 的分詞器使用最長規則來進行分詞。所以它會把下面的表示式:
1.+(2)
理解成表達項“1.”,“+”,和“2”的組合。這樣的組合結果是由於“1.”是一個有效的表達項並且比表達項“1”要長,表達項“1.”會被當作“1.0”,使得它成為一個double型別而非int型別。而下面的表示式阻止了分析器錯誤的理解:
(1).+(2)

函式是物件
把函式當成值進行操作是函式型程式語言的基石。
函式在Scala語言裡面是一個物件,把函式作為引數進行傳遞,把它們存貯在變數中,或者當作另一 個函式的返回值都是可能的。
函式是物件,將給Scala填上無窮的威力,這點是Java語言做不到的。
來看個計時器的例子:

object Timer {

   def oncePerSecond(callback: () => Unit) {
       while (true) {callback(); Thread sleep 1000 }
   }

   //作為回撥的函式
   def timeFlies() {
       //使用預定義的函式println,而非使用System.out.println(...)
       println("每秒都列印一下..")
   }

   //主函式呼叫計時器並傳遞列印句子的函式作為回撥,這個程式永無止境的每秒列印一句話
   def main(args: Array[String]) {
       oncePerSecond(timeFlies)
   }
}

執行如下:
enter image description here

用匿名函式改進定時器程式
上面的定時器函式完全可以用匿名函式寫得更簡潔一些的。

object TimerAnonymous {
   def oncePerSecond(callback: () => Unit) {
       while (true) {callback(); Thread sleep 1000 }
   }

   def main(args: Array[String]) {

       oncePerSecond(() =>
           println("每秒都列印一下.."))
   }
}

有沒有發現呢?Scala真的很酷!很多好玩的!

enter image description here

相關文章