加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:42:13 所属栏目:安全 来源:网络整理
导读:我希望能够隐式地将数字元组(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) 我可
我希望能够隐式地将数字元组(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,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,t._2)
val a = (.5,.3)
val b = (1,1)+a // type mismatch found:(Double,Double) required:String

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读