2009-04-01 32 views
5

Tôi muốn có thể chuyển đổi hoàn toàn Tuples số (Ints và double) thành đối tượng vectơ.Làm cách nào để chuyển đổi hoàn toàn Tuples thành véc tơ trong Scala

Giả sử một lớp Vector với một phương pháp +

case class Vector(x: Double, y:Double){ 
    def + (v:Vector)= new Vector(x+v.x,y+v.y) 
} 

Mục tiêu của tôi là phải có công việc mã sau.

val vec = (1,2)+(.5,.3) // vec == Vector(1.5,2.3) 

tôi có thể lấy nó để làm việc cho Int như sau

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) 

Nhưng nó không thành công khi tôi thêm các chuyển đổi cho đôi

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 

Cố gắng chỉ tăng gấp đôi mỗi sugestion Andri của

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 

Tôi cần làm gì để làm việc này?

Trả lời

11

Cú pháp của Scala linh hoạt, nhưng nó không phải là vô cùng linh hoạt. Đặc biệt, hợp lưu của các bộ dữ liệu, tham số, và implicits làm cho nó trở thành một khu vực thực sự nguy hiểm trong không gian thiết kế thư viện. Như bạn đã nhận thấy, mọi thứ có khả năng vỡ, không hoạt động tốt và cung cấp thông báo lỗi khó hiểu. Tôi đề nghị bạn tránh nó nếu bạn có thể.

Đặc biệt, tôi đề nghị bạn thực hiện các nghĩa sau đây:

val V = Vector 

Và sau đó tất cả các ví dụ của bạn làm việc như bạn mong muốn, mà không cần bất kỳ implicits, ma thuật, hoặc thông báo lỗi khó hiểu, và phải trả giá bằng chỉ một ký tự trên mỗi 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 

Nó không chính xác cú pháp bạn muốn, nhưng hãy tin tôi, nó sẽ giúp bạn giảm đau và đau đầu trong thời gian dài.

0

Những chuyển đổi tiềm ẩn này không rõ ràng và do đó Scala sẽ không sử dụng một trong số chúng. Đây là lý do tại sao các dòng cuối cùng sẽ không đánh giá.

Một cách để khắc phục điều này sẽ rời khỏi hoàn toàn int2vec, mặc dù điều này có nghĩa là tất cả các số nguyên đầu tiên sẽ được chuyển đổi hoàn toàn thành Đôi.

+0

Cảm ơn bạn. Tôi rõ ràng là một thằng ngốc vì tôi vẫn không thể làm cho nó hoạt động được. – ScalaNoob

Các vấn đề liên quan