語法糖沪斟,又稱為糖衣語法,指計(jì)算機(jī)語言中添加的某種語法暇矫,這種語法對(duì)語言的功能并沒有影響主之,但是更方便程序員使用。通常來說可以增加程序的可讀性李根,從而減少程度代碼出錯(cuò)的機(jī)會(huì)槽奕。接下來就會(huì)介紹兩個(gè) Scala 中的語法糖。
在 Scala 中房轿,如果我們要頻繁調(diào)用某個(gè) class 或 object 的方法粤攒,我們可以通過定義 apply 方法來避免每次寫出該函數(shù)的調(diào)用,而使用一種更加簡(jiǎn)潔的方式囱持,來看下面的例子:
不使用 apply 方法
scala> class truck {
| def transport( goods: Int ): Unit = {
| println( "truck transport " + goods + "t goods" )
| }
| }
defined class truck
scala> val t = new truck
t: truck = truck@77468bd9
scala> t.transport( 100 )
truck transport 100t goods
使用 apply 方法
scala> class truck {
| def apply( goods: Int ): Unit = {
| println( "truck transport " + goods + "t goods" )
| }
| }
defined class truck
scala>
scala> val t = new truck
t: truck = truck@68bbe345
scala> t(100)
truck transport 100t goods
上面兩個(gè)例子的效果是完全一樣的夯接,下面這個(gè)定義了 apply 的類能讓我們?cè)陬l繁調(diào)用某個(gè)方法的時(shí)候更加方便。當(dāng)然纷妆,apply 方法支持任意類型和任意個(gè)參數(shù)盔几。
另一種 apply 常用的使用場(chǎng)景是用 object 來創(chuàng)建其伴生類的實(shí)例。如下例:
private class truck {
println( "new truck created!" )
}
object truck {
def apply(): Unit = {
new truck
}
}
object TT {
def main (args: Array[String]) {
val t = truck()
}
}
輸出:
new truck created!
其實(shí)上例中掩幢,truck()
就是調(diào)用了truck.apply()
方法逊拍,編譯器在編譯時(shí)將truck()
編譯成truck.apply()
,如果你對(duì)編譯后的結(jié)果進(jìn)行反編譯就能驗(yàn)證這一點(diǎn)际邻,這留給有興趣的同學(xué)自行實(shí)踐芯丧,這里不展開了。
apply 方法在我們平時(shí)寫代碼時(shí)也經(jīng)常碰到世曾,比如:
val l = List(1,2,3)
中的 List(1,2,3)
調(diào)用就是調(diào)用的 object List 的 apply 方法
除了 apply 方法缨恒,還有一個(gè)用于賦值時(shí)的 update 方法,
scala> val a = mutable.Map[ Int, Int ]()
a: scala.collection.mutable.Map[Int,Int] = Map()
scala> a(1) = 1
scala> println( a )
Map(1 -> 1)
當(dāng)我們調(diào)用 a(1) = 1
的時(shí)候其實(shí)是在調(diào)用 a.update(1,1)
轮听,當(dāng)然你也可以在自定義類中實(shí)現(xiàn) update 使調(diào)用更方便骗露。就像下面這個(gè)例子一樣
scala> class A {
| private var a = 0
|
| def update( i: Int ): Unit = {
| a = i
| println( a )
| }
| }
defined class A
scala> val a = new A
a: A = A@27e47833
scala> a() = 2
2
**傳送門: **Scala 在簡(jiǎn)書目錄