2015-10-13 29 views
0

我是比較新的Scala和通過一些教程,我在http://docs.scala-lang.org/overviews/collections/maps.html撞上了這段代碼會:提取物中階:應用之間的差異()和定義的函數

import scala.collection.mutable.{Map, 
SynchronizedMap, HashMap} 

object MapMaker{ 
    def makeMap: Map[String,String] = { 
    new HashMap[String,String] with SynchronizedMap[String,String]{ 
     override def default(key:String) = "Why do you want to know?" 
    }             
    } 
} 

val capital = MapMaker.makeMap 

capital ++ List("US" -> "Washington", 
    "Paris" -> "France", "Japan" -> "Tokyo") 

我試圖創建一個「應用「函數內部的對象,並擺脫MapMaker.makeMap語法。因此,而不是代碼是這樣的

object MapMaker{ 
    def apply: Map[String,String] = { 
    new HashMap[String,String] with SynchronizedMap[String,String]{ 
     override def default(key:String) = "Why do you want to know?" 
    }             
    } 
} 

val capital = MapMaker 
capital ++ List("US" -> "Washington", 
"Paris" -> "France", "Japan" -> "Tokyo") 

但它不工作,因爲它返回一個別樣的價值

scala> val capital = MapMaker 
capital: MapMaker.type = [email protected] 

我只是在做這個學習的時間和方式的緣故使用您在提取器對象中使用的「應用函數」。

回答

2

在這一行:

val capital = MapMaker 

你是不是隱含調用對象MapMakerapply方法;你只是讓變量capital參考MapMaker對象。

首先,你必須有一個空的參數列表()定義apply方法:

object MapMaker { 
    // Note: def apply() instead of def apply 
    def apply(): Map[String,String] = { 
    // ... 
    } 
} 

然後,你可以這樣做:

val capital = MapMaker() 

注意MapMaker()MapMaker.apply()短的語法。

1

當直接編寫MapMaker時,並不是調用apply方法,而是引用object本身。您可以通過添加空括號來實現呼叫:

val capital = MapMaker() 
相關問題