Odd ...scala Map.getOrElse - wie Funktion für Standard bieten
val h = new HashMap[Long, Int]()
def mydefault0():Int = 101
println(h.getOrElse(99, default=mydefault0 _)) // Prints <function0>
def mydefault1(key:Long):Int = 102
println(h.getOrElse(98, default=mydefault1 _)) // Prints <function1>
The docs sagen, dass Standard-Typ sein müssen: => B
Wenn ich richtig verstehe, eine no- Arg-Funktion gibt in diesem Fall einen Int zurück.
Warum wird das Beispiel, das mydefault1 verwendet, kompiliert, da es ein Argument benötigt und die Spezifikation erfüllt?
Warum werden Funktionen zurückgegeben, anstatt dass Funktionen aufgerufen werden, um einen Standardwert zu erhalten? Anscheinend wurde die Typsicherheit aufgehoben, weil getOrElse ein Int und keine Funktion zurückgeben muss. (Wenn ich die Dokumente missverstanden habe und fälschlicherweise eine Funktion angegeben habe, bei der ein Int-Wert benötigt wurde, warum ließ mich der Compiler eine Funktion anstelle eines Int bereitstellen?).
bearbeiten
klar:
- erweitert HashMap und übergeordneten Standard oder
- angeben mit HashMap.withDefault
auch eine Funktion von verwendeten lassen ein Standardwert Was ich möchte, ist in der Lage zu sein, den Standard mit einer Funktion zu überschreiben, die zum Zeitpunkt der Suche bereitgestellt wird (d.h. die Funktion kann sich während der Lebensdauer der Karte ändern)
Ist das möglich?
Danke, das hat meinen Fehler geklärt. Aber zurück zur Frage ... Angenommen, ich wollte eine Map [String, Array [Int]], ich wäre nicht in der Lage, getOrElse zu verwenden, um ein neues Standard-Array zu erstellen, wenn der Schlüssel fehlt, nicht wahr? Dies würde dazu führen, dass jeder Wert das gleiche Objekt ist. Mit anderen Worten, es gibt keine Möglichkeit, eine Funktion zum Generieren eines Standardwerts bei jedem Suchvorgang bereitzustellen (das Überschreiben des Standardwerts von HashMap oder das Verwenden von Map.withDefault erlaubt mir nicht, den Standardgenerator anzugeben, wenn ich den Suchvorgang durchführe). – user48956
Es ist sehr wichtig zu verstehen, was by-name Parameter sind und wie sie sich verhalten (und warum sie * nicht * "faul" sind). Das wichtigste, was man über Namensparameter wissen sollte, ist, dass die Methode * called * bestimmt, wie oft der tatsächliche Parameterausdruck ausgewertet wird, und das kann 0, 1 * oder mehr * mal sein. Ein Lazy-Parameter wird nur 0 oder 1 Mal ausgewertet. –
Danke - das macht jetzt alles Sinn. – user48956