Пример карты Scala не работает должным образом - PullRequest
2 голосов
/ 24 октября 2010

Я делаю все примеры из книги "Pragmatic Bookshelf Programming Scala". Это простой пример синглтона, но я не понимаю его правильно, т.е. значения из карты не выбираются. Можете ли вы указать на ошибку.

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)
()
()
()
()

1 Ответ

10 голосов
/ 24 октября 2010

Использование открытой фигурной скобки без знака равенства является загадочным сокращением для метода, который возвращает 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...