스칼라에서 튜플을 벡터로 암시 적으로 변환하는 방법
문제
숫자 (ints 및 double)의 튜플을 벡터 객체로 암시 적으로 변환 할 수 있기를 원합니다.
A + 메소드가있는 벡터 클래스를 가정합니다
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
안데리의 소거 당 두 배의 시도
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의 구문은 유연하지만 유연하게 유연하지는 않습니다. 특히, 튜플, 매개 변수 및 암시의 합류는 라이브러리 설계 공간에서 정말 위험한 영역이됩니다. 보시다시피, 상황이 깨지고 잘 작동하지 않고 비밀 오류 메시지를 제공 할 가능성이 높습니다. 가능하다면 피하는 것이 좋습니다.
특히 다음과 같은 정의를하는 것이 좋습니다.
val V = 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
그것은 당신이 원하는 구문이 아니지만, 나를 믿으십시오. 그것은 당신에게 장기적으로 고통과 두통을 구할 것입니다.
다른 팁
이러한 암시 적 변환은 모호하므로 Scala는 그 중 하나를 사용하지 않습니다. 이것이 마지막 줄이 평가하지 않는 이유입니다.
이것을 고치는 한 가지 방법은 떠날 것입니다 int2vec
이는 모든 정수가 먼저 암시 적으로 복식으로 변환된다는 것을 의미합니다.
제휴하지 않습니다 StackOverflow