2010-10-24 6 views
2

Je fais tous les exemples du livre "Pragmatic Bookshelf Programming Scala". C'est un simple exemple singleton mais je ne comprends pas bien, c'est-à-dire que les valeurs de la carte ne sont pas récupérées. Pouvez-vous signaler l'erreur.Exemple de carte Scala ne fonctionnant pas comme prévu

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

Et singleton MarkerFactory est comme ci-dessous

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") 
    } 

} 

Am obtenir la sortie comme ça.

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

double possible de [ Quand utiliser le signe égal dans une déclaration de méthode Scala?] (Http://stackoverflow.com/questions/944111/when-to-use-the-equals-sign-in-a-scala-method-declaration) –

Répondre

10

L'utilisation d'une accolade ouverte sans signe égal est un raccourci cryptique pour une méthode qui retourne Unit. (() est la seule valeur valide d'un Unit, et voilà pourquoi vos impressions de code ().)

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

Modifier à

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

Ou mieux encore

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

Au lieu de null, le "politiquement correct" idiome serait une option – Landei

+1

Pas cryptique, juste égaré. :-) –

Questions connexes