(2) - apply, update 語法糖

語法糖,又稱為糖衣語法,指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說可以增加程序的可讀性,從而減少程度代碼出錯的機會。接下來就會介紹兩個 Scala 中的語法糖。

在 Scala 中,如果我們要頻繁調(diào)用某個 class 或 object 的方法,我們可以通過定義 apply 方法來避免每次寫出該函數(shù)的調(diào)用,而使用一種更加簡潔的方式,來看下面的例子:

不使用 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

上面兩個例子的效果是完全一樣的,下面這個定義了 apply 的類能讓我們在頻繁調(diào)用某個方法的時候更加方便。當(dāng)然,apply 方法支持任意類型和任意個參數(shù)。

另一種 apply 常用的使用場景是用 object 來創(chuàng)建其伴生類的實例。如下例:

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!

其實上例中,truck()就是調(diào)用了truck.apply()方法,編譯器在編譯時將truck()編譯成truck.apply(),如果你對編譯后的結(jié)果進行反編譯就能驗證這一點,這留給有興趣的同學(xué)自行實踐,這里不展開了。

apply 方法在我們平時寫代碼時也經(jīng)常碰到,比如:

val l = List(1,2,3)

中的 List(1,2,3) 調(diào)用就是調(diào)用的 object List 的 apply 方法


除了 apply 方法,還有一個用于賦值時的 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 的時候其實是在調(diào)用 a.update(1,1),當(dāng)然你也可以在自定義類中實現(xiàn) update 使調(diào)用更方便。就像下面這個例子一樣

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 在簡書目錄

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

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

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