题
我想能够隐式转换的数字(整数和双)的元组到载体对象。
假设一个矢量类与+方法
case class Vector(x: Double, y:Double){
def + (v:Vector)= new Vector(x+v.x,y+v.y)
}
我的目标是有下面的代码工作。
val vec = (1,2)+(.5,.3) // vec == Vector(1.5,2.3)
我可以得到它的Int
具有以下
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)
但是,当我添加皈依双失败
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
尝试只是每安德里的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
我需要什么做的就是这个工作?
解决方案
Scala的语法是柔性的,但它不是无限灵活。具体而言,元组,参数和implicits汇合使这是一个非常危险的区域在库的设计空间。正如你已经注意到了,事情很可能断裂,无法正常工作,并给神秘的错误消息。我建议你避免它,如果你能。
在特别的,我建议你做出如下定义:
val V = Vector
然后所有工作的例子如您所料,没有任何implicits,魔术,或神秘的错误消息,并且以每向量只有一个字符的成本。
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
这不正是你想要的语法,但请相信我,它会痛和头痛节省您在长远。
其他提示
这些隐式转换是不明确的,因此Scala中不会使用它们的任一。这就是为什么最后行不会评价的原因。
要解决这个问题就完全离开int2vec
出来,虽然这意味着所有整数。将第一隐式转换成双打。一种方法
不隶属于 StackOverflow