2011-02-17 23 views
7

जावा, स्कैला, या आम तौर पर किसी भी जेवीएम भाषा में, संकुल का एक सेट है जो डिफ़ॉल्ट रूप से आयात किया जाता है। उदाहरण के लिए, जावा स्वचालित रूप से java.lang आयात करता है, आपको इसे अपनी जावा कोड फ़ाइल में करने की आवश्यकता नहीं है।डिफ़ॉल्ट पैकेज आयात

अब मुझे नहीं पता कि कौन सा घटक इस परवाह करता है (कंपाइलर? जेवीएम?), लेकिन क्या अतिरिक्त पैकेज या यहां तक ​​कि डिफ़ॉल्ट रूप से आयातित वर्गों का कोई तरीका है?

कहें कि आपके पास अपने प्रोजेक्ट में उपयोग किए जाने वाले उपयोगिता कार्यों के एक सेट को परिभाषित करने वाला पैकेज है (उदाहरण के लिए स्केल में scala.math हो सकता है), यह बहुत अच्छा होगा यदि आप प्रत्येक गणित से संबंधित वर्ग में इसके लिए आयात छोड़ने में सक्षम थे।

+0

"अगर आप आयात को छोड़ने में सक्षम थे तो यह बहुत अच्छा होगा"। क्यूं कर? आधुनिक आईडीई में ऑटो-पूर्ण है और आवश्यकतानुसार आयात जोड़ने के लिए कार्य करता है। इसके अलावा, आयात का उद्देश्य ज्यादातर प्रोग्रामर के लिए कोड दस्तावेज करना है। अगर आयात गुम हैं, तो प्रोग्रामर को यह कैसे पता होना चाहिए कि यह तीसरी आर्टी कक्षाओं का उपयोग करता है? –

+1

आपकी पिछली बात, मेरी राय में, परियोजना लेखक द्वारा निर्णय लिया जाना चाहिए। आप उस मुद्दे के बारे में किताबें लिख सकते हैं, इसलिए मैं इसे यहां अलग करना चाहता हूं। आपके पहले बिंदु के बारे में, सच है, कोई भी आधुनिक जावा आईडीई कक्षा के नाम को स्वतः हल कर सकता है और एक आयात जोड़ सकता है। तो यह केवल स्कैला से संबंधित एक मुद्दा हो सकता है। स्कैला (2.8) में, आपके पास "पैकेज ऑब्जेक्ट्स" हो सकते हैं जो पैकेज स्कोप पर फ़ील्ड और विधियों को परिभाषित कर सकते हैं। आप उन परिभाषाओं को दृश्यमान बनाते हैं जैसे कि वे उस वर्ग में परिभाषित किए गए थे जिसमें आप पैकेज आयात करके (वाइल्डकार्ड का उपयोग करके) काम कर रहे हैं। कोई आईडीई इस पल में मुझे जो पता है उससे समर्थन करता है। – pdinklag

+0

@AndrewThompson, बॉयलरप्लेट मेरी आंखों में अक्षमता = अक्षमता। – Pacerier

उत्तर

12

स्कैला, 2.8 के रूप में, पैकेज ऑब्जेक्ट्स है, जिनकी सामग्री स्वचालित रूप से पैकेज की प्रत्येक फ़ाइल में आयात की जाती है। package.scala नामक एक फ़ाइल अपने पैकेज के शीर्ष स्तर की निर्देशिका (जैसे, x/y/z/mypackage) में बनाएँ, और में यह

package x.y.z 

package object mypackage { 
    ... 
} 

तब पैकेज वस्तु के भीतर किसी भी परिभाषा स्वचालित रूप से आयात किया जाता है (यानी, कोई इंपोर्ट स्टेटमेंट की जरूरत है डाल) पैकेज xyzmypackage में किसी भी फाइल में

आप स्काला स्रोतों पर एक नज़र ले जा सकते हैं - एक मिल रहा है dir -name package.scala - उनमें से एक गुच्छा, स्केला के लिए सर्वोच्च परिभाषित करने अंतर्निहित आयात देखते हैं पैकेज स्वयं, जो स्वचालित रूप से प्रत्येक स्केल स्रोत फ़ाइल में आयात किया जाता है।

+0

अच्छा बिंदु। किसी दिए गए पैकेज के भीतर किसी भी कोड के लिए, यह एक अच्छा समाधान है। +1 – VonC

+2

@ वॉनसी कह रहा है +1 अच्छा है, लेकिन वास्तव में उत्तर को ऊपर उठाना भी अच्छा होगा। :-) –

+0

यह तब तक काम करता है जब तक आप एक और एक ही पैकेज में काम कर रहे हों, मैं पहले से ही इसका उपयोग कर रहा हूं। हालांकि, आमतौर पर आप पैकेज पेड़ के साथ काम करते हैं। दुर्भाग्यवश, पैकेज ऑब्जेक्ट्स विरासत में नहीं मिल सकते हैं और किसी पैकेज ऑब्जेक्ट के अंदर परिभाषा किसी भी उप पैकेज को प्रभावित नहीं करती है। इससे मुझे रूट पैकेज के लिए पैकेज ऑब्जेक्ट को परिभाषित करने की अनुमति मिल जाएगी और सबकुछ ठीक होगा। मुझे उम्मीद है कि भविष्य में यह संभव होगा। – pdinklag

1

जावा में ऐसा करने का कोई तरीका नहीं है।

+2

+1 ... (और धन्यवाद आकाश वहाँ नहीं है!) –

+0

मैं समझता हूं कि यह समझदारी बनाम कोडिंग दक्षता है, और जावा दर्शन कोड की अच्छी समझ रखने की कोशिश करता है (जो, आईएमओ, यह कई में विफल रहता है तरीकों से, लेकिन यह मामला हाथ में नहीं है), लेकिन मेरे प्रोजेक्ट के लिए मैंने कोडिंग दक्षता चुना है (यही कारण है कि मैं जावा पर स्कैला पसंद करता हूं), और इस तरह की एक सुविधा मेरे लिए जीवन को बहुत आसान बनाती है। आपको उचित नामित कक्षाओं में काम करना चाहिए, और ऐसा करने के लिए इनाम को हर जगह बहुत सारे पैकेज और कक्षाएं आयात करने की ज़रूरत है - बहुत अच्छा आईएमओ नहीं। – pdinklag

+0

@pdinklag कृपया मेरा उत्तर देखें; स्कैला में वह सुविधा है जिसे आप ढूंढ रहे हैं। –

11

Jim Balter स्काला 2,8 package objecthis answer में उल्लेख है (जाना यह वोट दें)।

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

ऐसा करने के लिए, परिभाषाओं को पैकेज ऑब्जेक्ट में रखें। प्रत्येक पैकेज को एक पैकेज ऑब्जेक्ट

स्कैला वास्तव में अपना scala package object है।
"Where to put package objects" देखें।

तो पैकेज ऑब्जेक्ट किसी दिए गए पैकेज के लिए स्पष्ट आयात की समस्या को हल कर सकता है, लेकिन किसी भी पैकेज के लिए नहीं।
इसके current limitations include:

  • सबसे पहले, आप को परिभाषित या पैकेज वस्तुओं में अतिभारित तरीकों के वारिस नहीं कर सकते हैं।
  • दूसरा, आप पैकेज ऑब्जेक्ट में किसी सदस्य को परिभाषित या उत्तराधिकारी नहीं बना सकते हैं जो एक ही पैकेज में शीर्ष-स्तरीय कक्षा या ऑब्जेक्ट का नाम भी है।

हम उम्मीद करते हैं कि कुछ भविष्य स्काला रिलीज इन प्रतिबंधों को छोड़ देगा।


मूल जवाब:

स्काला तरफ, की तरह एक सवाल "should Scala import scala.collection.JavaConversions._ by default?" पता चलता है कि आप सिर्फ एक स्काला उपयोगकर्ता के रूप में डिफ़ॉल्ट आयात नहीं जोड़ सकते।
इसे भाषा द्वारा समर्थित किया जाना है।

वैसे, निष्कर्ष था:

एक स्काला विशेषज्ञ दृष्टिकोण से: चलो इसे आसान बनाने के लिए और implicits कि पूर्ण न्यूनतम करने डिफ़ॉल्ट रूप से आयात किए जाते हैं की सीमा।

मुझे लगता है कि आप कुछ संकुल को जोड़ने के लिए अपने स्वयं के संकलक प्लगइन लिख सकते हैं:
Heiko Seeberger


Raphael टिप्पणी हालांकि करता है?

और यह सुनिश्चित करें कि यह Scala article describe how to extend the Scala compiler है।
लेकिन मुख्य समर्थित जोड़ कर रहे हैं:

  • आप संकलक करने के लिए एक चरण में जोड़ सकते हैं इस प्रकार अतिरिक्त चेक या अतिरिक्त पेड़ पुनर्लेखन उसके बाद प्रकार की जाँच के समाप्त हो गया है लागू जोड़ने।
  • आप एक एनोटेशन के बारे में कंपाइलर प्रकार-जांच जानकारी बता सकते हैं जिसका उद्देश्य प्रकारों पर लागू होना है।

तो भी (अतिरिक्त आयात सहित), मुझे यकीन है कि फिर से लिखने के प्रकार और कार्य (अंतर्निहित आयात आप के लिए पूछ रहे हैं के द्वारा संदर्भित) के लिए समय में किया जा होगा कहा नहीं कर रहा हूँ एक पेड़ फिर से लिखने के साथ सही ढंग से किया जा सकता है का विश्लेषण किया।
लेकिन शायद Scala Compiler Corner पर इसके बारे में और अधिक विचार हैं। java.lang से सभी वर्गों के

+0

मुझे लगता है कि आप कुछ संकुल जोड़ने के लिए अपना खुद का कंपाइलर प्लगइन लिख सकते हैं? – Raphael

+0

स्कैला 2.8 में चीजें बदल गई हैं; मेरा जवाब देखें –

4

डिफ़ॉल्ट आयात Java language Specification (7.5.5)

सभी अन्य वर्गों आयात बयान के साथ आयात होना है में निर्दिष्ट है।

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