Wie konvertiere ich implizit Tupeln Vektor in Scala
Frage
Ich möchte in der Lage sein, implizit Tupeln von Zahlen (Ints und doppelt) in ein Vektorobjekt zu umwandeln.
eine Vektor-Klasse mit einem + Verfahren Unter der Annahme,
case class Vector(x: Double, y:Double){
def + (v:Vector)= new Vector(x+v.x,y+v.y)
}
Mein Ziel ist es, die folgenden Code der Arbeit zu haben.
val vec = (1,2)+(.5,.3) // vec == Vector(1.5,2.3)
Ich kann die sie für Int
mit dem folgenden
implicit def int2vec(t:Tuple2[Int,Int])=new Vector(t._1,t._2)
val vec = (1,2)+(3,4) // vec == Vector(4.0,6.0)
Aber es schlägt fehl, wenn ich die convertion für Doppel hinzufügen
implicit def int2vec(t:Tuple2[Int,Int])=new Vector(t._1,t._2)
implicit def double2vec(t:Tuple2[Double,Double])=new Vector(t._1,t._2)
val a = (1,2)
val b = (.5,.3)
val c = (1,1)+b // vec = Vector(1.5,1.3)
val d = (1,2)+(.3,.5) // compile error: wrong number of arguments
val e = (1,2)+((.3,.5)) // compile error: type mismatch
Der Versuch verdoppelt nur pro Andri des sugestion
implicit def double2vec(t:Tuple2[Double,Double])=new Vector(t._1,t._2)
val a = (.5,.3)
val b = (1,1)+a // type mismatch found:(Double,Double) required:String
Was muss ich tun dies, um zu arbeiten?
Lösung
Scala Syntax ist flexibel, aber es ist nicht unendlich flexibel. Insbesondere macht die Einmündung von Tupeln, Parametern und implicits dies ein wirklich gefährliches Gebiet in der Bibliothek Bauraums. Wie Sie bemerkt haben, sind die Dinge wahrscheinlich zu brechen, nicht gut funktionieren, und kryptische Fehlermeldungen geben. Ich würde vorschlagen, Sie vermeiden es, wenn Sie können.
Insbesondere empfehle ich Ihnen die folgende Definition vor:
val V = Vector
Und dann werden alle Ihre Beispiele arbeiten, wie man erwarten würde, ohne implicits, Magie oder kryptische Fehlermeldungen und auf Kosten von nur einem Zeichen pro Vector.
val a = V(1,2)+V(.5,.3)
val b = V(1,2)+V(3,4)
val c = V(1,2)
val d = V(.5,.3)
val e = V(1,1)+b
val f = V(1,2)+V(.3,.5)
val g = V(.5,.3)
val h = V(1,1)+a
Es ist nicht gerade die Syntax, die Sie wollen, aber glauben Sie mir, es wird Ihnen Schmerzen und Kopfschmerzen auf lange Sicht speichern.
Andere Tipps
Diese impliziten Konvertierungen sind mehrdeutig und damit Scala wird auch nicht von ihnen. Dies ist der Grund, warum die letzten Zeilen nicht bewerten.
Eine Möglichkeit, dies zu beheben, um die int2vec
out vollständig verlassen würde, auch wenn dies bedeutet, dass alle Zahlen implizit konvertierte in Double ersten sein würden.