Definition einer Map von String-Funktion in Scala
Ich versuche zu definieren, eine Karte literal mit Schlüssel: String
, Wert: (Any)=>String
. Ich habe Folgendes versucht, bekomme aber immer einen syntax error:
def foo(x: Int): String = /...
def bar(x: Boolean): String = /...
val m = Map[String, (Any) => String]("hello" -> foo, "goodbye" -> bar)
- Auch wenn die syntax in deiner Frage war, muss es etwas lustig, dass du das machst mit dem Typen zu schicken, die richtige Art der Funktion, die Sie von der Karte. Es gibt eine Menge weitere Komplikation hier. Was sind Sie wirklich versucht, zu tun? Vielleicht gibt es eine bessere Lösung völlig, dass der sich nicht auf eine Karte der Funktionen der verschiedenen Arten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Komisch, dass niemand wirklich gab einen Typ, der würde Arbeit. Hier ist eine solche:
Der Grund, warum es funktioniert auf diese Weise ist, weil
Function1
ist die contra-Variante auf den Eingang, so(Nothing) => String
ist eine Superklasse von(Int) => String
. Es ist auch co-Variante auf den Ausgang, so(Nothing) => Any
wäre eine Superklasse für alle anderenFunction1
.Natürlich, Sie können es nicht verwenden, wie, dass. Ohne manifeste, können Sie nicht einmal herausfinden, was in den ursprünglichen Typ des
Function1
ist. Sie könnten versuchen, so etwas wie dieses, aber:Int => String ist nicht eine Unterklasse von Jedem => String, eher das Gegenteil. Sie können nicht (ersetzen) Int => String-Funktion, wenn ein code erwartet einen => String, da dieser code kann die Funktion mit, sagen wir, "Hallo".
@Ben Vorschlag funktioniert, aber wie ist es nützlich? Sie können nicht zum aufrufen der Funktion, sobald man es aus der Karte.
Wenn Sie wirklich wollen, dies zu tun, vielleicht define foo als eine partielle Funktion:
Natürlich, dies wird zur Laufzeit scheitern, wenn Sie übergeben einen string, aber man kann immer testen, ob die Funktion ok ist für die Verwendung mit Ihre parameter mithilfe isDefinedAt. (eine weitere alternative sein kann, zeigt, aber ich sehe nicht den Wert hier)
Wenn ich lassen Sie der compiler es mir scheinen, um eine illegale Form:
Sowieso, was Sie wollen, ist nicht der Typ
Any
aber eine generische für "jede Art", die_
:Ich habe gerade gebucht eine Frage zu gewusst wie: aufrufen von Funktionen, weil ich eigentlich gar nicht wissen.
Eigenschaft
Function1
ist kontravariant für parameter, sodef foo(x: Int): String
ist nicht ein(Any) => String
. Also Folgendes funktionieren würde:Dies ist, wie ich es Tat, erfüllen eine ähnliche Anforderung.