scala中的Extractor对象:apply()和已定义函数之间的区别

时间:2015-10-13 14:21:10

标签: scala

我对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")

我试图创建一个" apply"在对象内部运行并摆脱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 = MapMaker$@105cb38b

我这样做只是为了学习何时以及如何使用"应用功能"您在提取器对象中使用的。

2 个答案:

答案 0 :(得分:2)

在这一行:

apply

您并非隐式调用对象MapMaker的{​​{1}}方法;您只是让变量capital引用MapMaker对象。

首先,您必须使用空参数列表apply定义()方法:

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

然后,你可以这样做:

val capital = MapMaker()

请注意,MapMaker()MapMaker.apply()的简短语法。

答案 1 :(得分:1)

直接撰写MapMaker时,您不是在调用apply方法,而是引用object本身。您可以通过添加空括号来实现调用:

val capital = MapMaker()