自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

萬物皆對(duì)象:介紹Scala對(duì)象

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

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

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

4 Scala:萬物皆對(duì)象

Scala作為一個(gè)純面向?qū)ο蟮恼Z言,于是在Scala中萬物皆對(duì)象,包括數(shù)字和函數(shù)。在這方面,Scala于Java存在很大不同:Java區(qū)分原生類型(比如boolean和int)和引用類型,并且不能把函數(shù)當(dāng)初變量操縱。

4.1 數(shù)字和對(duì)象

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

1 + 2 * 3 / x

是由方法調(diào)用組成的。它等效于下面的表達(dá)式,我們?cè)谏弦还?jié)見過這個(gè)描述。

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

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

在第二個(gè)表達(dá)式中的這些括號(hào)是必須的,因?yàn)镾cala的分詞器使用最長規(guī)則來進(jìn)行分詞。所以他會(huì)把下面的表達(dá)式:

1.+(2)

理解成表達(dá)項(xiàng) 1. ,+,和2的組合。這樣的組合結(jié)果是由于1.是一個(gè)有效的表達(dá)項(xiàng)并且比表達(dá)項(xiàng)1要長,表達(dá)項(xiàng)1.會(huì)被當(dāng)作1.0 ,使得它成為一個(gè)double而不是int。而下面的表達(dá)式阻止了分析器錯(cuò)誤的理解

(1).+(2)

4.2 函數(shù)與對(duì)象

函數(shù)在Scala語言里面也是一個(gè)對(duì)象,也許這對(duì)于Java程序員來說這比較令人驚訝。于是吧函數(shù)作為參數(shù)進(jìn)行傳遞、把它們存貯在變量中、或者當(dāng)作另一個(gè)函數(shù)的返回值都是可能的。吧函數(shù)當(dāng)成值進(jìn)行操作是函數(shù)型編程語言的基石。

為了解釋為什么吧函數(shù)當(dāng)作值進(jìn)行操作是十分有用的,我們來考慮一個(gè)計(jì)時(shí)器函數(shù)。這個(gè)函數(shù)的目的是每隔一段時(shí)間就執(zhí)行某些操作。那么如何吧我們要做的操作傳入計(jì)時(shí)器呢?于是我們想吧他當(dāng)作一個(gè)函數(shù)。這種目前的函數(shù)對(duì)于經(jīng)常進(jìn)行用戶界面編程的程序員來說是最熟悉的:注冊(cè)一個(gè)回調(diào)函數(shù)以便在事件發(fā)生后得到通知。

在下面的程序中,計(jì)時(shí)器函數(shù)被叫做oncePerSceond,它接受一個(gè)回調(diào)函數(shù)作為參數(shù)。這種函數(shù)的類型被寫作 () => Unit ,他們不接受任何參數(shù)也沒有任何返回(Unit關(guān)鍵字類似于C/C++中的void)。程序的主函數(shù)調(diào)用計(jì)時(shí)器并傳遞一個(gè)打印某個(gè)句子的函數(shù)作為回調(diào)。換句話說,這個(gè)程序永無止境的每秒打印一個(gè)“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)
       
}
}

注意,我們輸出字符串時(shí)使用了一個(gè)預(yù)定義的函數(shù)println而不是使用System.out中的那個(gè)。

4.2.1 匿名函數(shù)

我們可以吧這個(gè)程序改的更加易于理解。首先我們發(fā)現(xiàn)定義函數(shù)timeFlies的***目的就是當(dāng)作傳給oncePerSecond的參數(shù)。這么看來給這種只用一次的函數(shù)命名似乎沒有什么太大的必要,事實(shí)上我們可以在用到這個(gè)函數(shù)的時(shí)候再定義它。這些可以通過匿名函數(shù)在Scala中實(shí)現(xiàn),匿名函數(shù)顧名思義就是沒有名字的函數(shù)。我們?cè)谛掳娴某绦蛑袑?huì)使用一個(gè)匿名函數(shù)來代替原來的timeFlise函數(shù),程序看起來像這樣:

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

本例中的匿名函數(shù)使用了一個(gè)箭頭(=>)吧他的參數(shù)列表和代碼分開。在這里參數(shù)列表是空的,所以我們?cè)谟壹^的左邊寫上了一對(duì)空括號(hào)。函數(shù)體內(nèi)容與上面的timeFlise是相同的。

了解了Scala對(duì)象的特點(diǎn),接下來一篇將會(huì)介紹Scala類。

【相關(guān)閱讀】

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

2011-06-28 11:06:16

Scala

2015-08-24 09:18:17

2014-08-11 14:36:42

2015-03-03 14:25:40

2017-03-01 17:24:05

5G5G網(wǎng)絡(luò)4G

2019-02-27 16:00:48

JS原型原型鏈對(duì)象

2021-08-03 11:36:33

云計(jì)算

2021-03-01 08:19:09

Java 包裝類對(duì)象

2024-04-10 07:40:45

Java虛擬機(jī)內(nèi)存

2020-10-12 17:21:21

IPv6互聯(lián)網(wǎng)技術(shù)

2017-11-30 13:29:39

邊緣智算ECC

2018-08-20 11:49:46

華為

2012-12-12 16:18:32

互聯(lián)網(wǎng)思科IPv6

2014-08-06 09:29:08

2015-01-05 13:06:22

2021-01-27 05:34:33

Python對(duì)象模型

2019-03-18 08:08:24

知識(shí)圖譜技術(shù)

2019-10-10 05:00:49

物聯(lián)網(wǎng)聯(lián)網(wǎng)技術(shù)IOT

2016-04-19 10:01:57

物聯(lián)網(wǎng)互聯(lián)網(wǎng)

2016-05-29 21:18:21

微軟Azure物聯(lián)網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)