2012-02-22 8 views
18

Im usando la función Scala Map#get, y precisa para cada consulta que devuelve como Some[String]Scala Mapa # get y el regreso de algunos()

hay una manera fácil de quitar el Some?

Ejemplo:

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

Cuando utilizo este método y use la siguiente entrada:

What Word would you like defined? Ontology 

el valor devuelto es:

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

me gustaría quitar el Algunos() Alrededor de eso.

¿Algún consejo?

+0

Ver también: http://stackoverflow.com/questions/9364250/working-with-some-and-option -in-scala –

+3

Lo maravilloso de 'Option' es que te obliga a manejar el caso' None'. –

Respuesta

32

Hay muchas maneras de manejar el tipo Option. En primer lugar, sin embargo, se dan cuenta de cuánto mejor es tener esto en lugar de una posible referencia null! No intente deshacerse de él simplemente porque está acostumbrado a cómo funciona Java.

Como dijo recientemente otra persona: quédese con ella durante unas semanas y se quejará cada vez que tenga que volver a un idioma que no ofrece Option tipos.

Ahora en cuanto a su pregunta, la manera más simple y más arriesgada es la siguiente:

mymap.get(something).get 

Calling .get en un objeto Some recupera el objeto en su interior. Sin embargo, le ofrece una excepción de tiempo de ejecución si tenía un None en su lugar (por ejemplo, si la clave no estaba en su mapa).

Una manera mucho más limpia es utilizar Option.foreach o Option.map así:

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> 

Como se puede ver, esto le permite ejecutar una sentencia si y sólo si tiene un valor real. Si el Option es None, no pasará nada.

Por último, también es popular el uso de patrones sobre Option tipos como este:

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

'mymap (algo)' se ve más bonito. – elbowich

+0

@elbowich: Sí, 'mymap (algo)' parece ser una buena alternativa cuando sabes que 'something' está ciertamente contenido en el mapa. – cib