2012-02-22 13 views
18

im przy scala Map#get funkcję, a dla każdego dokładne zapytania to powraca jako Some[String]Scala Mapa # get i powrót niektórych()

Czy istnieje prosty sposób usunąć Some?

Przykład:

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

Kiedy użyć tej metody i użyć następującego kodu:

What Word would you like defined? Ontology 

Zwrócona wartość jest:

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

Chciałbym usunąć Niektóre() wokół tego.

Jakieś wskazówki?

+0

Zobacz również: http://stackoverflow.com/questions/9364250/working-with-some-and-option -in-scala –

+3

Cudowną rzeczą w opcji jest to, że zmusza cię do radzenia sobie z przypadkiem 'Brak'. –

Odpowiedz

32

Istnieje wiele sposobów postępowania z typem Option. Przede wszystkim jednak zdaj sobie sprawę, o ile lepsze jest posiadanie tego, zamiast odniesienia do potencjalnego null! Nie próbuj się go pozbyć, ponieważ jesteś przyzwyczajony do tego, jak działa Java.

Jak ktoś niedawno stwierdził: trzymaj się go przez kilka tygodni, a będziesz jęczeć za każdym razem, gdy będziesz musiał wrócić do języka, który nie oferuje typów Option.

Teraz jak na swoje pytanie, najprostszy i ryzykowny sposób to:

mymap.get(something).get 

Wywołanie .get na Some obiektu pobiera obiekt wewnątrz. Daje jednak wyjątek środowiska wykonawczego, jeśli zamiast tego masz None (na przykład, jeśli klucza nie ma na mapie).

znacznie czystszym sposobem jest użycie Option.foreach lub Option.map tak:

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> 

Jak widać, ten pozwala na wykonanie oświadczenie wtedy i tylko wtedy, gdy mają rzeczywistą wartość. Jeśli zamiast tego Option ma wartość None, nic się nie stanie.

Wreszcie, jest również popularne w użyciu wzorca dopasowania na Option typów tak:

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

'mymap (coś)' wygląda ładniej. – elbowich

+0

@elbowich: Tak, 'mymap (coś)' wydaje się być dobrą alternatywą, gdy wiesz, że 'coś' jest z pewnością zawarte na mapie. – cib