Scala

2009-04-01 15 views
5

'da Tupl'leri dolaylı olarak vektöre nasıl dönüştürebilirim Tuple sayısını (Ints ve double) bir vektör nesnesine dolaylı olarak dönüştürmek istiyorum.Scala

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

Amacım Aşağıdaki kod iş var olmaktır a + yöntemiyle bir Vector sınıfını varsayarsak.

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

Ben şu

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) 

ile Int için çalışmaya alabilirsiniz Ama sadece ANDRI sugestion başına iki katına çalışılıyor çift

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 

için konvertibıl eklerken başarısız

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 

Bunu işe almak için ne yapmam gerekiyor?

cevap

11

Scala'nın sözdizimi esnektir, ancak sonsuz esnek değildir. Özellikle, tupllerin, parametrelerin ve örtüklerin izdihamı, bunu kütüphane tasarım alanında gerçekten tehlikeli bir alan yapar. Fark ettiğiniz gibi, işler kırılmaya, iyi çalışmayacak ve şifreli hata mesajları vermeye devam edecektir. Yapabilmen için ondan kaçınmanı öneririm. o zaman beklediğiniz gibi tüm örnekler herhangi implicits, büyü ya da şifreli hata iletileri olmadan çalışmak

val V = Vector 

Ve ve pahasına: Özellikle

, sana şu tanımı yapmak önermek Vektör başına sadece bir karakter.

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 

Tam istediğiniz sözdizimi, ama bana güven vermiyor, uzun vadede ve baş ağrıları kaydedeceğiz.

0

Bu örtük dönüşümler belirsizdir ve dolayısıyla Scala bunlardan hiçbirini kullanmaz. Son satırların değerlendirilmemesinin nedeni budur.

Bunu düzeltmenin bir yolu int2vec'u tamamen dışarda bırakacaktı, bununla birlikte, tüm tamsayılar ilk olarak dolaylı olarak Çiftler'e dönüştürülecektir.

+0

Teşekkür ederiz. Hala işe yaramayacak olduğumdan belli ki bir aptalım. – ScalaNoob