您好,登錄后才能下訂單哦!
這篇文章主要介紹Scala對象的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
Scala作為一個純面向對象的語言,于是在Scala中萬物皆對象,包括數字和函數。在這方面,Scala于Java存在很大不同:Java區分原生類型(比如boolean和int)和引用類型,并且不能把函數當初變量操縱。
1 數字和對象
由于數字本身就是對象,所以他們也有方法。事實上我們平時使用的算數表達式(如下例)
1 + 2 * 3 / x
是由方法調用組成的。它等效于下面的表達式,我們在上一節見過這個描述。
(1).+(((2).*(3))./(x))
這也意味著 +,-,*,/ 在Scala中也是有效的名稱。
在第二個表達式中的這些括號是必須的,因為Scala的分詞器使用最長規則來進行分詞。所以他會把下面的表達式:
1.+(2)
理解成表達項 1. ,+,和2的組合。這樣的組合結果是由于1.是一個有效的表達項并且比表達項1要長,表達項1.會被當作1.0 ,使得它成為一個double而不是int。而下面的表達式阻止了分析器錯誤的理解
(1).+(2)
2 函數與對象
函數在Scala語言里面也是一個對象,也許這對于Java程序員來說這比較令人驚訝。于是吧函數作為參數進行傳遞、把它們存貯在變量中、或者當作另一個函數的返回值都是可能的。吧函數當成值進行操作是函數型編程語言的基石。
為了解釋為什么吧函數當作值進行操作是十分有用的,我們來考慮一個計時器函數。這個函數的目的是每隔一段時間就執行某些操作。那么如何吧我們要做的操作傳入計時器呢?于是我們想吧他當作一個函數。這種目前的函數對于經常進行用戶界面編程的程序員來說是最熟悉的:注冊一個回調函數以便在事件發生后得到通知。
在下面的程序中,計時器函數被叫做oncePerSceond,它接受一個回調函數作為參數。這種函數的類型被寫作 () => Unit ,他們不接受任何參數也沒有任何返回(Unit關鍵字類似于C/C++中的void)。程序的主函數調用計時器并傳遞一個打印某個句子的函數作為回調。換句話說,這個程序永無止境的每秒打印一個“time flies like an arrow”。
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)
}
}
注意,我們輸出字符串時使用了一個預定義的函數println而不是使用System.out中的那個。
2.1 匿名函數
我們可以吧這個程序改的更加易于理解。首先我們發現定義函數timeFlies的***目的就是當作傳給oncePerSecond的參數。這么看來給這種只用一次的函數命名似乎沒有什么太大的必要,事實上我們可以在用到這個函數的時候再定義它。這些可以通過匿名函數在Scala中實現,匿名函數顧名思義就是沒有名字的函數。我們在新版的程序中將會使用一個匿名函數來代替原來的timeFlise函數,程序看起來像這樣:
object TimerAnonymous {
def oncePerSecond(callback: () => Unit) {
while (true) { callback(); Thread sleep 1000 }
}
def main(args: Array[String]) {
oncePerSecond(() =>
println("time flies like an arrow..."))
}
}
本例中的匿名函數使用了一個箭頭(=>)吧他的參數列表和代碼分開。在這里參數列表是空的,所以我們在右箭頭的左邊寫上了一對空括號。函數體內容與上面的timeFlise是相同的。
以上是“Scala對象的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。