成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

萬物皆對象:介紹Scala對象

開發 后端
本文為初學Scala的Java開發者介紹了Scala對象。在Scala中萬物皆對象,包括數字和函數。在這方面,Scala于Java存在很大不同。

本文源自Michel Schinz和Philipp Haller所寫的A Scala Tutorial for Java programmers,由Bearice成中文。之前一篇為Scala簡單做了一下入門,這一篇描述Scala對象。在Scala中,一切都是對象,所以數字和函數都是Scala對象。

51CTO編輯推薦:Scala編程語言專題

4 Scala:萬物皆對象

Scala作為一個純面向對象的語言,于是在Scala中萬物皆對象,包括數字和函數。在這方面,Scala于Java存在很大不同:Java區分原生類型(比如boolean和int)和引用類型,并且不能把函數當初變量操縱。

4.1 數字和對象

由于數字本身就是對象,所以他們也有方法。事實上我們平時使用的算數表達式(如下例)

1 + 2 * 3 / x

是由方法調用組成的。它等效于下面的表達式,我們在上一節見過這個描述。

(1).+(((2).*(3))./(x))

這也意味著 +,-,*,/ 在Scala中也是有效的名稱。

在第二個表達式中的這些括號是必須的,因為Scala的分詞器使用最長規則來進行分詞。所以他會把下面的表達式:

1.+(2)

理解成表達項 1. ,+,和2的組合。這樣的組合結果是由于1.是一個有效的表達項并且比表達項1要長,表達項1.會被當作1.0 ,使得它成為一個double而不是int。而下面的表達式阻止了分析器錯誤的理解

(1).+(2)

4.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中的那個。

4.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對象的特點,接下來一篇將會介紹Scala類。

【相關閱讀】

  1. Scala入門:Scala例子,以及如何與Java交互
  2. Scala開發環境搭建與資源推薦
  3. Google App Engine上的Scala+Lift初試
  4. Scala初學者學習資料:main(String[])
  5. 影響Scala語言設計的因素列表
責任編輯:yangsai 來源: Google code
相關推薦

2011-06-28 11:06:16

Scala

2015-08-24 09:18:17

2014-08-11 14:36:42

2017-03-01 17:24:05

5G5G網絡4G

2015-03-03 14:25:40

2019-02-27 16:00:48

JS原型原型鏈對象

2021-08-03 11:36:33

云計算

2021-03-01 08:19:09

Java 包裝類對象

2024-04-10 07:40:45

Java虛擬機內存

2020-10-12 17:21:21

IPv6互聯網技術

2012-12-12 16:18:32

互聯網思科IPv6

2017-11-30 13:29:39

邊緣智算ECC

2018-08-20 11:49:46

華為

2015-01-05 13:06:22

2014-08-06 09:29:08

2021-01-27 05:34:33

Python對象模型

2017-11-30 15:27:50

物聯網

2016-04-19 10:01:57

物聯網互聯網

2016-05-29 21:18:21

微軟Azure物聯網

2019-10-10 05:00:49

物聯網聯網技術IOT
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 视频在线一区二区 | 成人免费黄视频 | 成av在线 | 精品久久久久久亚洲精品 | 国产成人亚洲精品 | 日韩一区中文字幕 | 日韩在线免费 | 亚洲精品久久久蜜桃网站 | 亚欧午夜| 色偷偷噜噜噜亚洲男人 | 国产69久久精品成人看动漫 | 亚洲一区二区三区免费视频 | 一级黄色片毛片 | 国产一区二区三区免费 | 男女啪啪高潮无遮挡免费动态 | 婷婷综合久久 | 色久五月 | 国产99久久精品一区二区永久免费 | 欧美精品一区在线发布 | 国产一区二区三区视频在线观看 | 日本中文字幕一区 | 狠狠操狠狠干 | 中文字幕一区二区三区四区五区 | 国产成人一区二区三区久久久 | 激情视频中文字幕 | 日韩精品一区二区三区视频播放 | 视频在线亚洲 | 国产区一区二区三区 | 夜夜精品视频 | 99久久久久 | 日韩欧美国产一区二区 | 亚洲黄色网址视频 | 综合久久99 | 欧美男人亚洲天堂 | 成人福利网 | 国产一区91精品张津瑜 | 亚洲国产视频一区 | 91精品国产一区二区三区 | 另类二区 | 亚洲人成免费 | 国产精品91视频 |