我想能够隐式转换的数字(整数和双)的元组到载体对象。

假设一个矢量类与+方法

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出来,虽然这意味着所有整数。将第一隐式转换成双打。一种方法

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top