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?
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
Personnellement, j'aime bien utiliser .getOrElse(String)
et utiliser quelque chose comme "None" par défaut, c'est-à-dire .getOrElse("None")
.