web-dev-qa-db-fra.com

Scala Map # get et le retour de Some ()

En utilisant la fonction scala Map#get, et pour chaque requête précise, elle retourne sous la forme Some[String]

Existe-t-il un moyen facile de supprimer la Some?

Exemple:

def searchDefs{
    print("What Word would you like defined? ")
    val selection = readLine
    println(selection + ":\n\t" + definitionMap.get(selection))
  }

Lorsque j'utilise cette méthode et que j'utilise l'entrée suivante:

What Word would you like defined? Ontology

La valeur retournée est:

Ontology:
    Some(A set of representational primitives with which to model a domain of knowledge or discourse.)

Je voudrais supprimer le Some () autour de cela.

Des conseils?

20
meriley

Il existe de nombreuses façons de traiter le type Option. Tout d’abord, cependant, réalisez à quel point il est préférable d’avoir cette référence au lieu d’une référence null potentielle! N'essayez pas de vous en débarrasser simplement parce que vous êtes habitué au fonctionnement de Java.

Comme quelqu'un d'autre l'a récemment déclaré: restez-y pendant quelques semaines et vous gémirez à chaque fois que vous devrez revenir à une langue qui ne propose pas de types Option.

En ce qui concerne votre question, la manière la plus simple et la plus risquée est la suivante:

mymap.get(something).get

L'appel de .get sur un objet Some récupère l'objet à l'intérieur. Cependant, il vous donne une exception d'exécution si vous aviez plutôt une None (par exemple, si la clé ne se trouvait pas dans votre carte).

Une méthode beaucoup plus propre consiste à utiliser Option.foreach ou Option.map comme ceci:

scala> val map = Map(1 -> 2)
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)

scala> map.get(1).foreach( i => println("Got: " + i))
Got: 2

scala> map.get(2).foreach( i => println("Got: " + i))

scala> 

Comme vous pouvez le constater, cela vous permet d'exécuter une instruction si et seulement si vous avez une valeur réelle. Si Option est plutôt None, rien ne se passera.

Enfin, il est également courant d’utiliser la correspondance de modèle sur les types Option comme ceci:

scala> map.get(1) match {
     |  case Some(i) => println("Got something")
     |  case None => println("Got nothing")
     | }
Got something
34
Frank

Personnellement, j'aime bien utiliser .getOrElse(String) et utiliser quelque chose comme "None" par défaut, c'est-à-dire .getOrElse("None").

0
Albaro Pereyra