我对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
我这样做只是为了学习何时以及如何使用"应用功能"您在提取器对象中使用的。
答案 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()