문제

숫자 (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 이는 모든 정수가 먼저 암시 적으로 복식으로 변환된다는 것을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top