Scala 學習筆記(二)— Everything is an object


Everything is an object

前言

Scala is a pure object-oriented language in the sense that everything is an object,including numbers or functions. It differs from Java in that respect, since Java distinguishes primitive types (such as boolean and int) from reference types, and does not enable one to manipulate functions as values.


Numbers are objects
Since numbers are objects, they also have methods.
例如,算式 1 + 2*3 / x,若將每一個number都寫成對象的方式,則為
.+(((2).*(3))./(x))
括號在式子中是必須的,因為如果寫成1.+(2)的話,scala的詞法分析器會這樣斷句:
+    2
如此一來,前面的“1.”就會被當成“1.0”,這樣計算出來的結果就是double類型的數據了。例如:

如果是按規范寫成(1).+(2)的話,就還是int類型的數據

之所以用這么矯情的寫法,主要是為了說明number在scala中也是object,它擁有".+"方法。Scala也是可以用更貼近平時習慣的算式寫法的:


Functions are objects
對java程序員來說,更新鮮的一點就是function也是object。這以為着function也可以當成value一樣進行傳遞。
Functions are also objects in Scala.It is therefore possible to pass functions as arguments, to store them in variables, and to return them from other functions.
對C語言還有印象的人應該還記得call-back function(回調函數)這個東西。它其實就相當於把函數當做值來傳遞了,不過在C中傳遞的是這個函數的地址。
看看下面這段代碼:

object Timer {
    def oncePerSecond(callback: () => Unit) {
        while(true) { callback(); Thread sleep 1000 }
    }
    def timeFlies() {
        println("time flies like an arrow...")
    }

    def main(args: Array[String]) {
        oncePerSecond(timeFlies)
    }
}

可以看到,timeFlies函數被當做回調函數注冊給了oncePerSecond。這種方式跟C很像。不過,這里面其實有點浪費,因為timeFlies函數其實根本不需要名字,因為它只在一個特定的地方用到了。如果把它想象成“一團東西”,那么只要把“這團東西”塞到它應該待的位置即可,根本不會再有別人關心它叫什么名字(好像有點傷感……)
這樣,就產生了anony-mous functions(匿名函數),如下:

object TimerAnonymous {
    def oncePerSecond(callback: () => Unit) {
        while(true) { callback(); Thread sleep 1000 }
    }
    def main(args: Array[String]) {
        oncePerSecond(() => println("time flies like an arrow..."))
    }
}

可以看到() =>println("time flies like an arrow...")這團東西”(其實是一個匿名函數)被當做一個object,直接塞到了使用它的地方。這個做法跟javascript的匿名函數很像,但是無論在有C中還是java中都是挺難想象的。Scala就可以這么做。

總結:
Scala在java的基礎之上,將面向對象的“萬物皆為對象”的思想更推進了一步,把function也視為object,允許它作為參數出現,也允許它被賦值給一個變量,甚至還運行它作為一個返回值來進行回饋。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM