Scala映射示例未按预期工作

Ket*_*nar 2 scala

我正在从"Pragmatic Bookshelf Programming Scala"一书中做所有的例子.这是一个简单的单例示例,但我没有把它弄好,即不提取map中的值.你能指出错误吗?

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

而单身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")
  }

}
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出.

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)
()
()
()
()
Run Code Online (Sandbox Code Playgroud)

Ken*_*oom 10

使用没有等号的开放式大括号对于返回的方法来说是神秘的简写Unit.(()是a的唯一有效值Unit,这就是您的代码打印的原因().)

def getMarker(color: String) {
  if (markers.contains(color)) markers(color) else null
}
Run Code Online (Sandbox Code Playgroud)

将其更改为

def getMarker(color: String)  = {
  if (markers.contains(color)) markers(color) else null
}
Run Code Online (Sandbox Code Playgroud)

或者更好

def getMarker(color: String) = markers.getOrElse(color,null)
Run Code Online (Sandbox Code Playgroud)