UPDATE
die Antworten Alle hier gut sind, aber @ senia der tut dies die am unmittelbarsten, ohne dass zusätzliche Schritte. Dies führt möglicherweise zu Fehlern, aber wenn die Map [Symbol, T] -Konvention in Hunderten von Methoden verwendet wird, wird eine einstufige implizite Konvertierung vor der Kartenerstellung bevorzugt (Vermeidung des Symbol-Map-Schlüssel-Permgenspeichers). Jedenfalls, hier ist der Zuhälter:Scala Karte, implict Symbol Schlüssel zum String
class SymbolProvidesPair(i: Symbol) { def ->[T](s: T) = (i.toString.tail, s) }
@inline implicit def symbol2String(i: Symbol) = new SymbolProvidesPair(i)
Original-
Es stört mich ein bisschen String-Schlüssel in Maps, verlangsamt mich nur nach unten und ist, IMO, nicht als syntaktisch einfach auf die Augen als Symboltasten .
val map: Map[String, Int] = Map("strings" -> 1, "blow" -> 2)
val map: Map[String, Int] = Map('symbols -> 1, 'rock -> 2)
Also, habe ich eine implizite mein Juckreiz zu kratzen:
implicit def symbolKey2String[A <: Symbol, B](x:(A,B)) = (x._1.toString, x._2)
Paar Dinge:
1) ist dies die korrekte Signatur? Das obige funktioniert, aber A <: Symbol
Ich meine, etwas, das von Symbol gegenüber etwas abstammt, das Symbol entspricht.
2) Ich werde dies verwenden, wenn ich Maps manuell eintippe; d.h. nur zur Bequemlichkeit. Werde ich irgendwelche Haken mit diesem impliziten treffen? Es scheint Rand Case genug, um keine Probleme (wie String2Int, zum Beispiel) zu verursachen, aber nicht sicher, ob ich etwas vermisse.
Dank
EDIT
Ok, gut 1 # kann ich eigentlich nur sagen, was ich meine, [Symbol, B]
statt [A <: Symbol, B]
Aber jetzt habe ich mich mit einem anderen Problem zu finden, das Symbol-to- string implizit bringt mich in eine Ecke der Art, wie ich dann Map [String, Type] für alle neuen Maps explizit definieren muss (dh die nette Compiler-Typ-Inferenz verlieren), um Symbol-Schlüssel verwenden zu können.
Wie dann, um das Beste aus beiden Welten zu bekommen, Kartensymbolschlüssel, aber mit abgeleiteten [String, Type], wenn nicht die Typ-Signatur angeben? das heißt, den Compiler schließen Karte haben [String, Int], wenn ich tun:
val map = Map('foo -> 1)
hmmm, ich denke, ich könnte einfach "Symbol" für "A" ersetzen ;-) – virtualeyes
Diese Art von Verhalten könnte andere Entwickler überraschen. Vielleicht wäre es besser, '->' durch ein anderes Wort zu ersetzen? Zum Beispiel ': ->' oder '~>'. – senia
Ich denke, im Zusammenhang mit Pimp-My-Library-Muster (das ist genau das Muster in Ihrer Antwort zur Verfügung gestellt), Symbol -> Typ ist völlig in Ordnung. Das Schöne am Scala-Compiler ist, dass jeder, der verwirrt ist, seine Maus über "->" bewegen kann, um durchzuklicken und das Implizite zu sehen. In Ruby, Groovy, etc., eher eine magische Mystery Tour ohne explizite Dokumentation. Außerdem nehmen Symbol Map-Schlüssel Permgen auf, so dass ihre augenscheinliche Verwendung einige Augenbrauen (und Untersuchung) aufwerfen sollte. Schließlich wird der Compiler Map [String, Type] ableiten, so dass auch einer herausfinden sollte, wie es passiert – virtualeyes