Why are type synonyms necessary to define extractors for patten matching Java classes in Scala? -
यदि कोई मौजूदा जावा वर्ग pkg.Test,
पैकेज pkg; सार्वजनिक कक्षा परीक्षण {सार्वजनिक int v; सार्वजनिक परीक्षा (इंट v) {this.v = v; }} एक स्काला साथी ऑब्जेक्ट को परिभाषित करके एक एक्स्ट्रेक्टर बनाने का प्रयास
पैकेज pkg ऑब्जेक्ट टेस्ट {def unapply (t: टेस्ट): विकल्प [Int ] = कुछ (टी वी)} त्रुटि उत्पन्न करती है "टेस्ट पहले ही ऑब्जेक्ट टेस्ट के रूप में परिभाषित है"। हालांकि, अगर कोई नया पैकेज में जावा क्लास के लिए समानार्थता बनता है तो सबकुछ काम करता है
पैकेज pkg पैकेज ऑब्जेक्ट मैटकर्स {टाइप करें test = pkg.Test} और नए पैकेज में संबंधित ऑब्जेक्ट को परिभाषित करें
पैकेज pkg.matchers वस्तु परीक्षण {def unapply (t: टेस्ट): विकल्प [इंट] = कुछ (टीवी)} अब दोनों पैटर्न और मूल वर्ग के सभी सदस्य नए पैकेज से उपलब्ध हैं
import pkg.matchers._ ऑब्जेक्ट मुख्य {डीईफ़ मुख्य (args: Array [स्ट्रिंग]) {val t = नया टेस्ट (1) टी मैच {केस टेस्ट (वी) = & gt; Println (v)} println (t.v)}} यह अजीब लगता है कि एक प्रकार का पर्याय जोड़कर यह काम करने देता है एक नए पैकेज का उपयोग करने के अलावा, क्या इस तरह से मिलान करने के लिए पैटर्न जोड़ने में कोई समस्या है? मूल पैकेज में एक्स्ट्रेक्टर उपलब्ध कराने का कोई तरीका क्या है?
ऐसा इसलिए है क्योंकि जावा पुस्तकालयों, स्काला को स्काला की सिंगलटन ऑब्जेक्ट के लिए जावा की स्थिर विधि को मैप करने का एक तरीका चाहिए। उदाहरण के लिए, यदि आपके पास निम्न जावा वर्ग है:
package pkg; कक्षा परीक्षण {सार्वजनिक स्थिर शून्य प्रिंटहेलो () {System.out.println ("हैलो"); }} हम स्काला में printHello कैसे आमंत्रित कर सकते हैं? यह निम्न की तरह दिखेगा: आयात करें pkg.Test test.printHello () जैसा कि आप देख सकते हैं, सिंटैक्स वही है जैसे एक ऑब्जेक्ट टेस्ट में विधि। इस बिंदु से, टेस्ट सिंगलटन पहले से ही परिभाषित है, और आप दो बार एक ही एफक्यूएनए के साथ ऑब्जेक्ट परिभाषित नहीं कर सकते। यही कारण है कि आपको इसकी आवश्यकता है pkg.matchers.Test परिभाषित करें तो यह pkg.Test के साथ संघर्ष नहीं करेगा। और Scala के संकलक को यह समझने में काफी चालाक है कि Pkg.matchers.Test एक सिंगलटन है जो इसे new कीवर्ड का उपयोग नहीं कर सका है, इसलिए जब आप नया टेस्ट (1) लिखते हैं, तो यह pkg.matchers.Test के बजाय pkg.Test यही कारण है कि आप अपने कोड उदाहरण में एक ही समय में उनका उपयोग कर सकते हैं। वास्तव में, आपको टाइप की आवश्यकता नहीं है test = pkg.Test बिल्कुल भी, निम्न कार्य कर रहा है ठीक: <प्री> पैकेज pkg पैकेज मैटर्स {ऑब्जेक्ट टेस्ट {डीईटी (अनुप: टी: टेस्ट):) [विकल्प] = कुछ (टीवी)}} मुख्य वस्तु {import pkg.matchers._ डीईफ़ मुख्य (आर्ग्स: ऐरे [स्ट्रिंग]) {val t = नया टेस्ट (1) टी मैच {केस टेस्ट (वी) = & gt; प्रिंट्लएन (वी)} println (tv)}} अपडेट
एक्स्टेंक्टर को एक साथी ऑब्जेक्ट बनने की आवश्यकता नहीं है, जिसका मतलब है कि आपको इसी वर्ग की आवश्यकता नहीं है । किसी भी वस्तु के साथ अनुपयुक्त विधि चिमटा के रूप में काम कर सकता है ऑब्जेक्ट स्ट्रिंग लैंग (def) अनुपयुक्त (एक्स: स्ट्रिंग): विकल्प [इंट] = कुछ (एक्स.लाइन)} ऑब्जेक्ट मुख्य {डीईफ़ मुख्य (एजीआर: एरे [स्ट्रिंग]) {"हैलो वर्ल्ड "मैच {केस स्ट्रिंग लैेंथ (एक्स) = & gt; Println ("लंबाई:" + x)}}} इसलिए यदि मुख्य विधि pkg में नहीं है, तो आपके पास निम्न विकल्प हैं: अपने एक्स्ट्रेक्टर को किसी अन्य नाम से नाम दें, इसलिए संकलक जान सकता है कि आप एक्सट्रैक्टर का उपयोग कर रहे हैं।
FQN का उपयोग करना, फिर से pkg.matchers.Test के बजाय pkg.Test । पैकेज pkg.matchers {import pkg._ ऑब्जेक्ट परीक्षण {def} अनुपयुक्त (टी: टेस्ट): विकल्प [इंट] = कुछ (टीवी)}} वस्तु मुख्य {एआरजी: एरे [स्ट्रिंग]) {आयात पीकेजी। टेस्ट वैल टी = नया टेस्ट (1) टी मैच {केस पीकेजी। Matchers.Test (वी) = & gt; Println (v)} println (tv)}} pkg.Test का नाम बदलकर आयात करें कोड> सिंटैक्स, इसलिए यह pkg.matchers.Test । ऑब्जेक्ट मुख्य {डीईफ़ मुख्य (आर्ग्स: ऐरे [स्ट्रिंग]) के साथ संघर्ष नहीं करेगा {import pkg । {टेस्ट = & gt; JTest} आयात pkg.matchers.Test वैल टी = नया JTest (1) टी मैच {मामले टेस्ट (वी) = & gt; Println (v)} println (tv)}} बस pkg से आयात करें, आयात pkg.matcher से .test विशेष रूप से। def मुख्य (आर्ग्स: ऐरे [स्ट्रिंग]) {import pkg._ import pkg.matchers.Test val t = नया टेस्ट (1) टी मैच { केस टेस्ट (वी) = & gt; Println (v)} println (t.v)}
Comments
Post a Comment