2012-03-04 16 views
6
  • मेरे पास 3 स्कैला कक्षाएं (ए, बी, सी) हैं। > बी और बी से एक - -
  • मैं एक से एक अंतर्निहित रूपांतरण है मेरी कोड में> सी

कुछ बिंदु पर, मैं ए पर एक सी विधि कॉल करना चाहते हैं यह संभव है? एक फिक्स मैं आया था ए -> सी से रूपांतरण करना है, लेकिन यह कुछ हद तक अनावश्यक लगता है।स्कैला ट्रांजिटिव निहित रूपांतरण

नोट:

  • जब मैं यह काम करता है एक पर बी तरीकों कहते हैं।
  • जब मैं बी पर सी विधियों को कॉल करता हूं तो यह काम करता है।
  • जब मैं एक पर सी तरीकों कॉल यह कहना है कि वह का एक

धन्यवाद शरीर में विधि ...

+6

संकेत: यह _associativity_ की तुलना में _transitivity_ जैसा दिखता है। और आप स्काला के निहितार्थों के लिए यह चाहते हैं कि पहले व्यक्ति नहीं हैं। इसके अलावा 'ए -> सी' शायद आपकी दूसरी पंक्ति में 'बी -> सी' के लिए एक टाइपो है? –

+0

धन्यवाद। मैं जल्दी में था। –

+3

पर भी एक नज़र डालें: [कैसे-कर-i-chain-implicits-in-scala] (http://stackoverflow.com/questions/5332801/how-can-i-chain-implicits-in-scala) –

उत्तर

6

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

आप स्कैला चेन को आपके लिए निहित रूपांतरण कर सकते हैं, हालांकि, यदि आप निर्दिष्ट करते हैं कि यह किया जाना है। कुंजी <% के साथ जेनेरिक का उपयोग करना है जिसका अर्थ है "इसमें परिवर्तित किया जा सकता है"। यहां एक उदाहरण दिया गया है:

class Foo(i: Int) { def foo = i } 
class Bar(s: String) { def bar = s } 
class Okay(b: Boolean) { def okay = b } 
implicit def to_bar_through_foo[T <% Foo](t: T) = new Bar((t: Foo).foo.toString) 
implicit def to_okay_through_bar[U <% Bar](u: U) = new Okay((u: Bar).bar.length < 4) 

scala> (new Foo(5)).okay 
res0: Boolean = true 
+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। –

+0

हाँ, मैंने <% चीज़ की कोशिश की और यह काम किया। लेकिन यह ऐरे [स्ट्रिंग] => यूनिट कंपाइलर त्रुटि से एक अजीब निहित भी उत्पन्न हुआ। तो मैं मैन्युअल रूप से अंतराल को ब्रिज करने के लिए वापस आ गया हूं। आपकी मदद के लिए टैंक। –

9

ऐसा लगता है कि जब आप प्रश्न लिखा आप लिखने में कोई त्रुटि नहीं मिला है कि । क्या आपका कहना है कि आपके पास A -> B और B -> C से अंतर्निहित रूपांतरण हैं, और आपको A -> C रूपांतरण अनावश्यक लगता है?

स्काला एक नियम है कि यह केवल एक अंतर्निहित रूपांतरण लागू होगी जब आवश्यक (लेकिन कभी दो) है, तो आप सिर्फ स्काला जादुई A -> B और B -> C रचना के लिए रूपांतरण की जरूरत बनाने के लिए उम्मीद नहीं कर सकते है। आपको अपना खुद का A -> C रूपांतरण प्रदान करना होगा। यह अनावश्यक नहीं है।

+4

एक कारण यह है कि ऐसा क्यों है कि मध्यम प्रकार के लिए कई संभावनाएं हो सकती हैं। यदि निहित रूपांतरण 'ए -> बी 1', 'बी 1 -> सी' और' ए -> बी 2', 'बी 2 -> सी' मौजूद हैं, तो संकलक यह अनुमान लगाने में असमर्थ होगा कि आप कौन सी चाहते थे। – hammar

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। –

+0

'अंतर्निहित डीफ़ ट्रांजिटिव [ए, बी, सी] (अंतर्निहित ए 2 बी: ए => बी, बी 2 सी: बी => सी): ए => सी = (ए: ए) => बी 2 सी (ए 2 बी (ए)) 'यह सैद्धांतिक रूप से ट्रांजिटिव रिज़ॉल्यूशन करना संभव है। लेकिन उस मामले में प्रत्येक 'निहित [ए => बी] 'अलग हो जाता है, क्योंकि निहित' $ अनुरूप है [ए]: ए => ए' - रिज़ॉल्यूशन एल्गोरिदम लूपिंग समाप्त होता है। – phadej

संबंधित मुद्दे