当前位置:  开发笔记 > 编程语言 > 正文

如何在Scala中将元组隐式转换为向量

如何解决《如何在Scala中将元组隐式转换为向量》经验,为你挑选了1个好方法。

我希望能够隐式地将数字元组(Ints和double)转换为矢量对象.

假设Vector类带有+方法

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)

但是当我添加转换为double时它失败了

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

每个Andri的消化尝试只加倍

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 

我需要做些什么才能让它发挥作用?



1> Jorge Ortiz..:

Scala的语法很灵活,但它不是无限灵活的.特别是,元组,参数和隐含的汇合使得这在图书馆设计空间中成为一个非常危险的区域.正如您所注意到的,事情可能会破裂,不能正常工作,并提供神秘的错误消息.如果可以,我建议你避免它.

特别是,我建议你做出以下定义:

val V = Vector

然后你所有的例子都按照你的期望工作,没有任何暗示,魔法或神秘的错误信息,并且每个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

这不完全是你想要的语法,但相信我,从长远来看,它将为你省去痛苦和头痛.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有