2013-11-22 18 views
25

Jak mogę uzyskać wartość domyślną w przypadku dopasowania?Przypadek Scala pasuje do wartości domyślnej

//Just an example, this value is usually not known 
val something: String = "value" 

something match { 
    case "val" => "default" 
    case _ => smth(_) //need to reference the value here - doesn't work 
} 

UPDATE: widzę, że mój problem nie był naprawdę rozumieć, dlatego jestem ilustrujący przykład, który jest bliżej do prawdziwych pracuję nad:

val db = current.configuration.getList("instance").get.unwrapped() 
      .map(f => f.asInstanceOf[java.util.HashMap[String, String]].toMap) 
      .find(el => el("url").contains(referer)) 
      .getOrElse(Map("config" -> "")) 
      .get("config").get match { 
       case "" => current.configuration.getString("database").getOrElse("defaultDatabase") 
       case _ => doSomethingWithDefault(_) 
      } 
+2

Nie wiesz, masz na myśli to może być? 'case _ => smth (something)' –

+0

@DavidRiccitelli że 'coś' pochodzi z bardzo długiej sekwencji czynności, dlatego potrzebuję innego sposobu na odniesienie się do niego – Caballero

+0

Aby lepiej zrozumieć, czy próbujesz przekazać' coś' ' smth' kiedy 'coś' nie jest równe' val'? (jako przykład) –

Odpowiedz

39
something match { 
    case "val" => "default" 
    case default => smth(default) 
} 

to nie jest słowem kluczowym, po prostu aliasem, więc to będzie działać jak dobrze:

something match { 
    case "val" => "default" 
    case everythingElse => smth(everythingElse) 
} 
+1

lub jeśli nie potrzebujesz używać zmiennej, może to być anonimowe: case _ => doSomething –

+2

@JeroenKransen Twoja propozycja jest dokładnie równa temu, co zaczęło się od –

+0

Nie zrozumiałem również ważnego pytania. Pojawiło się podobne niedawne pytanie: Jak odwołać się do _ w funkcji anon. Może to jedna z tych złudzeń optycznych. –

12

"_" w Scali jest składnią miłości i nienawiści, która może być naprawdę przydatna, a mimo to dezorientująca.

W przykładzie:

something match { 
    case "val" => "default" 
    case _ => smth(_) //need to reference the value here - doesn't work 
} 

_ środki, nie dbam o wartości, jak również od rodzaju, co oznacza, że ​​nie może odwoływać się do identyfikatora więcej. Dlatego smth (_) nie ma właściwego odniesienia.
Rozwiązanie to, że można podać nazwę identyfikatora jak:

something match { 
    case "val" => "default" 
    case x => smth(x) 
} 

Wierzę, że to jest składnia pracę i x dopasuje dowolną wartość, ale nie „val”.

Mówiąc więcej. Sądzę, że jesteś zdezorientowany na przykład przez użycie podkreślenia na mapie, płaskiej mapie.

val mylist = List(1, 2, 3) 
mylist map { println(_) } 

Miejsce, w którym podkreślenie tutaj odnosi się do elementu iteracji w kolekcji. Oczywiście, to podkreślenia mógłby nawet być traktowane jako:

mylist map { println } 
+0

W rzeczywistości nie chodzi tylko o Scalę - podkreślenie rzeczy - nie obchodzi mnie to w SML, Clojure i niektórych innych językach. –

2

oto inna opcja:

something match { 
    case "val" => "default" 
    case [email protected]_ => smth(default) 
} 
+2

Dla osób takich jak ja, które nigdy nie widziały ani nie zapomniały o tym: patrz [Scala @ operator] (http://stackoverflow.com/questions/2359014/scala-operator) –

Powiązane problemy