2009-04-01 18 views
5

में ट्यूपल्स को सदिश में कैसे परिवर्तित कर सकता हूं, मैं एक वेक्टर ऑब्जेक्ट में संख्याओं (इंट्स और डबल) के पूर्ण रूप से परिवर्तित करने में सक्षम होना चाहता हूं।मैं स्केल

एक + विधि

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) 

मैं इसे निम्नलिखित

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) 

साथ Int के लिए काम करने के लिए प्राप्त कर सकते हैं लेकिन यह विफल रहता है जब मैं के लिए डबल

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 

रूपांतरण जोड़ने सिर्फ एंड्री के sugestion प्रति दोगुनी कोशिश कर रहा

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 

इसे काम करने के लिए मुझे क्या करने की ज़रूरत है?

उत्तर

11

स्कैला का वाक्यविन्यास लचीला है, लेकिन यह असीम रूप से लचीला नहीं है। विशेष रूप से, tuples, पैरामीटर, और implicits के संगम पुस्तकालय डिजाइन अंतरिक्ष में यह वास्तव में एक खतरनाक क्षेत्र बनाता है। जैसा कि आपने देखा है, चीजें तोड़ने की संभावना है, अच्छी तरह से काम नहीं करते हैं, और गुप्त त्रुटि संदेश देते हैं। मैं सुझाव दूंगा कि यदि आप कर सकते हैं तो आप इससे बचें।

val V = Vector 

और फिर अपने सभी उदाहरण काम आपकी अपेक्षानुसार किसी भी implicits, जादू, या गुप्त त्रुटि संदेश के बिना, है, और की कीमत पर:

विशेष रूप से, मैं तुम्हें निम्नलिखित परिभाषा बनाने का सुझाव वेक्टर प्रति केवल एक चरित्र।

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 

यह बिल्कुल वाक्य रचना आप चाहते हैं, लेकिन मुझ पर विश्वास नहीं है, यह आप लंबे समय में दर्द और सिरदर्द बचा सकते हैं।

0

ये अंतर्निहित रूपांतरण संदिग्ध हैं और इस प्रकार स्कैला उनमें से किसी का भी उपयोग नहीं करेगा। यही कारण है कि आखिरी लाइनों का मूल्यांकन नहीं किया जाएगा।

इसे ठीक करने का एक तरीका int2vec पूरी तरह से बाहर निकल जाएगा, हालांकि इसका मतलब है कि सभी पूर्णांक पहले पूर्ण रूप से डबल्स में परिवर्तित हो जाएंगे।

+0

धन्यवाद। मैं स्पष्ट रूप से मूर्ख हूं क्योंकि मैं इसे अभी भी काम नहीं कर सकता। – ScalaNoob