在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Scala/ Scala 課堂:基礎(chǔ)(四)
Scala 課堂:高級類型(二)
Scala 課堂:基礎(chǔ)(三)
Scala 課堂:類型和多態(tài)類型(一)
Scala 課堂:基礎(chǔ)(二)
Scala課堂:基礎(chǔ)(五)
Scala 課堂:基礎(chǔ)(四)
Scala 課堂:基礎(chǔ)(六)
Scala 課堂:集合(二)
Scala課堂:類型和多態(tài)類型(二)
Scala 課堂:模式匹配和函數(shù)組合
Scala 課堂:高級類型(一)
Scala 課堂:集合(一)
Scala 課堂:基礎(chǔ)(一)

Scala 課堂:基礎(chǔ)(四)

這里我們轉(zhuǎn)載 Twitter 的 Scala 課堂 ,轉(zhuǎn)載的內(nèi)容基本來自Twitter的Scala課堂中文翻譯,部分有小改動.

apply 方法

當(dāng)類或?qū)ο笥幸粋€主要用途的時候,apply 方法為你提供了一個很好的簡潔的語法結(jié)構(gòu)。


scala>  class Foo {}
defined class Foo

scala> object FooMaker {
     |  def apply() = new Foo
     | }
defined object FooMaker

scala> val newFoo =FooMaker()
newFoo: Foo = Foo@333038c7

或者:


scala> class Bar {
     |  def apply() =0
     | }
defined class Bar

scala>  val bar = new Bar
bar: Bar = Bar@706ba7cf

scala> bar()
res0: Int = 0

在這里,我們實例化對象看起來像是在調(diào)用一個方法。以后會有更多介紹!

單例對象

單例對象用于持有一個類的唯一實例。通常用于工廠模式。


object Timer {
  var count = 0

  def currentCount(): Long = {
    count += 1
    count
  }
}

可以這樣使用:


scala> Timer.currentCount()
res1: Long = 1

單例對象可以和類具有相同的名稱,此時該對象也被稱為“伴生對象”。我們通常將伴生對象作為工廠使用。

下面是一個簡單的例子,可以不需要使用’new’來創(chuàng)建一個實例了。


class Bar(foo: String)

object Bar {
  def apply(foo: String) = new Bar(foo)
}

函數(shù)即對象

在 Scala 中,我們經(jīng)常談?wù)搶ο蟮暮瘮?shù)式編程。這是什么意思?到底什么是函數(shù)呢?

函數(shù)是一些特質(zhì)的集合。具體來說,具有一個參數(shù)的函數(shù)是 Function1 特質(zhì)的一個實例。這個特征定義了 apply() 語法糖,讓你調(diào)用一個對象時就像你在調(diào)用一個函數(shù)。


object addOne extends Function1[Int, Int] {
     def apply(m: Int): Int = m + 1
}

defined object addOne

scala> addOne(1)
res2: Int = 2

這個 Function 特質(zhì)集合下標(biāo)從0開始一直到22。為什么是22?這是一個主觀的魔幻數(shù)字(magic number)。我從來沒有使用過多于22個參數(shù)的函數(shù),所以這個數(shù)字似乎是合理的。
apply 語法糖有助于統(tǒng)一對象和函數(shù)式編程的二重性。你可以傳遞類,并把它們當(dāng)做函數(shù)使用,而函數(shù)本質(zhì)上是類的實例。 這是否意味著,當(dāng)你在類中定義一個方法時,得到的實際上是一個 Function 的實例?不是的,在類中定義的方法是方法而不是函數(shù)。在 repl 中獨立定義的方法是 Function 的實例。 類也可以擴展 Function,這些類的實例可以使用()調(diào)用。


 class AddOne extends Function1[Int, Int] {
    def apply(m: Int): Int = m + 1
}

defined class AddOne

scala> val plusOne = new AddOne()
plusOne: AddOne = <function1>

scala> plusOne(1)
res3: Int = 2

可以使用更直觀快捷的 extends (Int => Int) 代替 extends Function1[Int, Int]


class AddOne extends (Int => Int) {
  def apply(m: Int): Int = m + 1
}

你可以將代碼組織在包里。


package com.twitter.example

在文件頭部定義包,會將文件中所有的代碼聲明在那個包中。 值和函數(shù)不能在類或單例對象之外定義。單例對象是組織靜態(tài)函數(shù)(static function)的有效工具。


package com.twitter.example

object colorHolder {
  val BLUE = "Blue"
  val RED = "Red"
}

現(xiàn)在你可以直接訪問這些成員


println("the color is: " + com.twitter.example.colorHolder.BLUE)