Warum Scala implizit umwandeln Char zu Int?
Blick auf scala Predef
- Objekt, das automatisch importiert ist, fand ich die folgende Edelstein
implicit def char2int(x : Char) : Int
Führte dies zu einer schmierigen bugs schleichen sich in mein code (verwendet _1
statt _2
im Map[Char,Int]
). Ich weiß wirklich nicht, warum würde ich wollen implizit konvertieren Char
zu Int
. Die ganze Idee des habens der Char
- Typ (eine bloße Zahl) ist, so dass ich nicht verwenden Sie es als eine Zahl (oder Umgekehrt).
Ich benutze das scala ' s Typsystem, um nicht Fehler wie das!
Nur (schlechte) Entschuldigung, wenn ich etwa ist kompatibel mit Java ist schrecklich Verhalten.
update: Der Hauptgrund, die zwei Antworten bisher, ist, dass die implizite Konvertierung wird durchgeführt, um die Unterstützung bestellt Handlungen auf die Char
geben. So, dass zum Beispiel 'c'+1
erzeugen würde d
. Wenn es das ist, was Sie wollen, Sie tun sollten,
class Char ...
...
def +(x:Int) = (this.toInt+x).toChar
def <(x:Char) = this.toInt < x.toInt
- und man könnte hinzufügen, und vergleichen Sie die Zeichen nach Ihren wünschen. Die Tatsache, dass Char
ist das einzige 16-bit Zahl, die nur bedeutet, dass wir brauchen eine neue Word
(oder Short
) geben.
- Ich habe gebissen worden von diesem zu, so dass Sie nicht allein sind gefragt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, wenn Sie denken, in Bezug darauf, wie eine
Char
vertreten istChar
ist jusr eine vorzeichenlose 16-bit-Feld, mit einem Bereich von (0 bis 2^16 - 1). Diese können passen, ohne einen überlauf in eineInt
(32 bit mit Vorzeichen, mit einem Bereich von -2^31 bis 2^31 - 1).Einige der Scala die grundlegenden Arten sind in der Reihenfolge der Länge Ihrer Darstellung in bits:
Byte
(8)Char
(16)Int
(32)Long
(64)Alle angemeldet sind, außer für
Char
und alle umsetzbar sind, um eine Art "unten", als würden Sie nie over/under-flow (mit AusnahmeByte
zuChar
, die nicht vorhanden ist). Sehen Sie all diese impliziten Konvertierungen in die Vordef.Dies ist der Grund, glaube ich, die implizite Konvertierungen existieren - um Ausdrücke wie den folgenden zu bestehen:
Andere Erklärung ist, entlang der Linien, die Sie gegeben haben (ein
Char
ist nur eine Zahl...). Für mich macht es Sinn - die Menge allerChars
ist enthalten in der Menge allerInt
s, und deshalb, meine Anwendung der eigenen Richtlinien für die Verwendung von implicits, die Konvertierung sollte eigentlich implizit sein.Verstehe ich Ihren ärger, wie ich Compiler zu signalisieren Fehler wie die, die Sie haben, nur gab als Beispiel. Es wäre schön, wenn Scala hatte eine Art, sich zu drehen implizite Konvertierung ab (oder drehen Sie bestimmten implizite Konvertierungen aus, da drehen Sie alle Weg würde wahrscheinlich Wrack Chaos!)
Die einzige Lösung sehe ich für dein problem ist mit
Map[RichChar, Int]
oder etwas ähnliches -RichChar
implizit in eineInt
, wie implizite Konvertierungen können nicht verkettet werden. BEARBEITEN fand heraus, dass es tatsächlich keine implizite Konvertierung vonRichChar
zuChar
.BEARBEITEN: Eigentlich haben Sie einen guten Blick auf die Scala-API,
Char
nicht überlastet+
Methode nimmt eineInt
argument. Gleiches gilt fürInt
. Dies könnte mit der Tatsache zu tun, dass die zugrunde liegenden JVM macht etwas ähnliches.Beachten Sie auch, dass das Beispiel, das ich habe gab, Sie hatte nichts zu tun mit dem hinzufügen von
Int
s zuChar
s! Dieser ist bereits zugelassen, der von der API. Die mehr subtile Punkt ist, dass, wenn Sie hinzufügen, einInt
zu einemChar
erhalten Sie eineInt
. Die implizite Konvertierung ist es, die es ermöglicht, das Ergebnis dieser addition alsChar
.Beachten Sie auch die mehr theoretische Antwort, die ich gegeben habe -
Char
ist eine Teilmenge vonInt
!-- Flaviu Cipcigan
Es kann nicht perfekt sein, aber Bedenken Sie die alternative...
Es ist nur eine Implementierung Wahl. An einer Stelle, die viele Sprachen haben, unterscheiden sich stark zwischen
char
undint
, aber da hatten Sie immer zu haben-Konvertierung-Funktionen, die es hat nicht wirklich einen block, der sehr viel und es hat nur ein großer Schmerz.Niemand wirklich will, um zu gehen zurück zu den Tagen von
chr(n)
undord(c)
alle über dem Platz. Vorstellen, was für ein Spaß UTF-8 handling wäre.Einmal C kam mit
char
s wirklichint
s, es hat gerockt, und übernachtet haben wir, auch in viel mehr stark typisierte Sprachen.Nun, sollten Sie wirklich wollen, eine gekapselte
Char
dass nicht automatisch konvertieren, nichts hält Sie von der Definition eines neuen Typs, sagenElazarChar
für Ihren eigenen code. Ich vermute, dass Sie werden es hassen.