2010-10-24 49 views
2

我正在做“Pragmatic Bookshelf Programming Scala”书中的所有示例。这是一个简单的单例例子,但我们没有弄清楚它的正确性,即来自map的值不会被提取。 你能指出错误吗?斯卡拉地图示例不按预期方式工作

class Marker(val color: String) { 
    println("Creating " + this) 
    override def toString(): String = "marker color is " + color 
} 

和辛格尔顿MarkerFactory是如下

object MarkerFactory { 
    private val markers = new HashMap[String, Marker]; 
    markers += "red" -> new Marker("red") 
    markers += "blue" -> new Marker("blue") 
    markers += "green" -> new Marker("green") 

    def getMarker(color: String) { 
    if (markers.contains(color)) markers(color) else null 
    } 

    def main(args: Array[String]) { 
    println(markers) 
    println((MarkerFactory getMarker "red").toString) 
    println(MarkerFactory getMarker "blue") 
    println(MarkerFactory getMarker "red") 
    println(MarkerFactory getMarker "yellow") 
    } 

} 

这样我得到的输出。

Creating marker color is red 
Creating marker color is blue 
Creating marker color is green 
Map(green -> marker color is green, red -> marker color is red, blue -> marker color is blue) 
() 
() 
() 
() 
+0

的可能重复[何时在Scala方法声明中使用等号?](http://stackoverflow.com/questions/944111/when-to-use-the-equals-sign-in-a-scala-method-declaration) – 2012-04-09 04:43:22

回答

10

使用一个开放的大括号没有等号是返回Unit的方法隐秘的简写。 (()Unit的唯一有效的价值,这就是为什么你的代码打印()。)

def getMarker(color: String) { 
    if (markers.contains(color)) markers(color) else null 
} 

将其更改为

def getMarker(color: String) = { 
    if (markers.contains(color)) markers(color) else null 
} 

或者更好的

def getMarker(color: String) = markers.getOrElse(color,null) 
+0

而不是空,“政治正确”的成语将是一个选项 – Landei 2010-10-25 07:14:24

+1

不隐晦,只是误导。 :-) – 2010-10-25 21:15:36