Scala學(xué)習(xí)筆記(一)

一、變量

獲取變量的值是一個(gè)耗時(shí)的工作時(shí),可以考慮使用lazy var.

lazy val forLater = someTimeConsumingOperation()

二、函數(shù)定義

“=”并不只是用來(lái)分割函數(shù)簽名和函數(shù)體的,它的另一個(gè)作用是告訴編譯器是否對(duì)函數(shù)的返回值進(jìn)行類型推斷!如果省去=,則認(rèn)為函數(shù)是沒(méi)有返回值的!

比如:

scala> def myFirstMethod() = { “exciting times ahead” }

myFirstMethod: ()java.lang.String

scala> def myFirstMethod(){ “exciting times ahead” }

myFirstMethod: ()Unit

三、方法調(diào)用

注:和本文的其他部分不同,該章節(jié)總結(jié)自《Learning Scala》一書(shū):Methods and Operators一節(jié),因?yàn)椤禨cala In Action》一書(shū)沒(méi)有集中對(duì)這個(gè)知識(shí)點(diǎn)的講解

通常,scala和其他大多數(shù)的語(yǔ)言一樣,對(duì)方法的調(diào)用使用是:infix dot notation格式,我們可以叫“小數(shù)點(diǎn)中輟格式”,也就是對(duì)象和方法名中間以“小數(shù)點(diǎn)”做中綴的方式:

與此同時(shí),scala還提供了另外一種方法調(diào)用方式:infix operator notation格式,我們可以叫“操作符中輟格式”,也就是把方法名當(dāng)做一種操作符,使用對(duì)象 方法名 參數(shù)中間以空格分隔的方式:

這我們思考一下為什么會(huì)出現(xiàn)這種樣式的方法調(diào)用,應(yīng)該說(shuō)這是用于引入了“操作符做方法名”而產(chǎn)生的一種自然需要!實(shí)際上,scala中允許使用操作符做方法名基本上與C++中的操作符重載是一樣的!

很顯然,當(dāng)我們引入了操作符重載之后,如果再使用“對(duì)象.方法名(參數(shù))”的方式調(diào)用方法會(huì)看上去非常古怪,也就是這里的d.+(2.721),此時(shí)就是使用infix operator notation樣式的合適場(chǎng)所!

當(dāng)然,這種調(diào)用樣式并不是一定要使用在以操作符為方法名的方法上,如果你習(xí)慣,也可以使用在普通方法上。

四、數(shù)組以及基本操作

對(duì)于給數(shù)組賦值的語(yǔ)句:array(0) = “This”,這里要說(shuō)明的是:不同于java中的array[0] = “This” 在scala中,[]永遠(yuǎn)是用來(lái)制定參數(shù)類型的!

迭代Array的操作是非常簡(jiǎn)單的,我們只需要使用它的foreach方法,同時(shí)傳遞一個(gè)函數(shù)字面量即可。下面典型的例子是在迭代main函數(shù)的args參數(shù)列表:

五、FOR循環(huán)

六、模式匹配:Pattern Matching

模式匹配,示例一:

模式匹配,示例二:

在下面的這個(gè)例子中展示了scala一些內(nèi)置的預(yù)定義的Pattern,專門應(yīng)用于case上的,例如下面例子中的:f,s, rest

模式匹配,示例三:

七、類 Class

What val and var do is define a field and a getter for that field, and in the case of var an additional setter method is also created. When both of them are missing, they’re treated as private instance values, not accessible to anyone outside the class.

對(duì)于Class的field的修飾符有如下約定:

使用var聲明field,則該field將同時(shí)擁有g(shù)etter和setter

scala> class MongoClient(var host:String, var port:Int)

使用val聲明field,則該field只有g(shù)etter。這意味著在初始化之后,你將無(wú)法再修改它的值。

scala> class MongoClient(val host:String, val port:Int)

如果沒(méi)有任何修飾符,則該field是完全私有的。

scala> class MongoClient(host:String, port:Int)

八、構(gòu)造函數(shù)

主構(gòu)造函數(shù):Primary Constructor

scala的主構(gòu)造函數(shù)指的是在定義Class時(shí)聲明的那個(gè)函數(shù)!簡(jiǎn)單的例子:

class MongoClient(val host:String, val port:Int)

對(duì)于這個(gè)class的定義,實(shí)際上它也是同時(shí)聲明了一個(gè)構(gòu)造函數(shù):this(val host:String, val port:Int), 它就是所謂的主構(gòu)造函數(shù)!

關(guān)于構(gòu)造函數(shù)重載

在scala中,構(gòu)造函數(shù)的重載和普通函數(shù)的重載是基本一樣的,區(qū)別只是構(gòu)造函數(shù)使用this關(guān)鍵字指代!當(dāng)然,也不能指定返回值。

對(duì)于重載構(gòu)造函數(shù):它的第一個(gè)語(yǔ)句必須是調(diào)用另外一個(gè)重載的構(gòu)造函數(shù)或者是主構(gòu)造函數(shù)!當(dāng)然除了主構(gòu)造函數(shù)以外!這個(gè)表述如果再深入地一想,那么我們就可以想到:所有的構(gòu)造函數(shù)在一開(kāi)始就會(huì)首先調(diào)用主函數(shù)??!這也是為什么:scala對(duì)寫(xiě)在Class內(nèi)的零星的腳本和代碼片段的處理是通過(guò)移到主構(gòu)造函數(shù)內(nèi)去執(zhí)行的原因!

九、scala類結(jié)構(gòu)圖

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容