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

arbeiten
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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top