2011-09-03 3 views
19

स्काला भाषा आप इसे उपयोग करने से पहले अपने उदाहरण चर प्रारंभ की आवश्यकता है। हालांकि, स्कैला आपके चर के लिए डिफ़ॉल्ट मान प्रदान नहीं करता है। इसके बजाय, आप वाइल्डकार्ड अंडरस्कोर, जिसका कोई डिफ़ॉल्ट मान की तरह काम करता का उपयोग करके स्वयं अपने मूल्य स्थापित करने के लिए है के रूप में इसक्यों स्काला भाषा आप के बजाय एक डिफ़ॉल्ट मान पर भरोसा करने की एक उदाहरण चर को प्रारंभ करने की आवश्यकता होती है?

var name:String = _ 

मुझे पता है, मुझे पता है ... मैं वर्ग परिभाषा एक निर्माता परिभाषित कर सकते हैं, जो पैरामीटर हमारे उदाहरण चर के रूप में लेता है, तो के रूप में नीचे

class Person(var name:String) 

हालांकि पता चला स्काला इसके प्रारंभ के लिए मजबूर नहीं करता है, मैं शरीर में यह घोषणा करने की जरूरत है क्योंकि मैं एक जावा एनोटेशन जिसका elementType क्षेत्र या विधि है उपयोग करने के लिए की जरूरत है; यानी, यह केवल हमारे वर्ग के शरीर में घोषित एक आवृत्ति चर या विधि पर लागू किया जा सकता है।

प्रश्न: क्यों स्काला भाषा आप एक उदाहरण चर को प्रारंभ करने की आवश्यकता होती है - के बजाय एक डिफ़ॉल्ट मान पर निर्भर के एक वर्ग के शरीर में घोषित - यह एक डिफ़ॉल्ट मान _ या जो भी आप चाहते हो सकता है?

+2

मार्टिन की वरीयता मेरा अनुमान होगा :-) कम से कम यह स्पष्ट है और अतिरिक्त 2 वर्ण (रिक्त स्थान के साथ 4) बहुत मुश्किल नहीं हैं। ऐसा लगता है कि जावा (एक बहुत * verbose * भाषा) असाइनमेंट को छोड़ दिया जाता है। साथ ही, यह "कन्स्ट्रक्टर तर्क" कहने के लिए भ्रामक लगता है (जो उन्हें वास्तव में बुलाया जाता है: - /) को प्रारंभ करने के लिए मजबूर नहीं किया जाता है - वे निश्चित रूप से तब होते हैं जब ऑब्जेक्ट तत्काल होता है। –

उत्तर

6

एनोटेशन लागू कर सकते हैं जब आप इसे कन्स्ट्रक्टर तर्क के रूप में निर्दिष्ट करते हैं। साथ ही, आपको उस मेटा-एनोटेशन का उपयोग करने की आवश्यकता हो सकती है, जिसका उपयोग आप एनोटेशन का उपयोग कर रहे हैं, पर लागू किया गया है - http://www.scala-lang.org/api/2.10.2-RC2/index.html#scala.annotation.meta.package

"डिफ़ॉल्ट मान पर भरोसा करने" के बारे में आपका प्रश्न कुछ हद तक अस्पष्ट है। अंडरस्कोर का उपयोग शुरू करने से वैरिएबल के मान को शून्य पर असाइन करने के अनुरूप होता है। आप किस अन्य डिफ़ॉल्ट के बारे में सोच रहे हैं? वर्ग शरीर में:

+0

मुझे पता है कि अंडरस्कोर साइन का उपयोग डिफ़ॉल्ट मान असाइन करने के लिए किया जाता है। हालांकि, मैं जानना चाहता हूं कि स्काला कक्षा के नाम में घोषित होने के बजाय क्यों var नाम: स्ट्रिंग (अंडरस्कोर असाइनमेंट के बिना) की अनुमति नहीं देता है। आपने स्कैला (+1) की एक अच्छी सुविधा की ओर इशारा किया जो मुझे नहीं पता था। हालांकि, यह मेरी ज़रूरतों को पूरा नहीं करता है क्योंकि मुझे नो-एर्ग कन्स्ट्रक्टर की भी आवश्यकता है जो ओवरराइड किया गया है यदि मैं क्लास परिभाषा –

+4

में घोषित कन्स्ट्रक्टर में अपना इंस्टेंस चर घोषित करता हूं, तो असाइनमेंट की आवश्यकता है, मुझे विश्वास है, ताकि संकलक एक अमूर्त var (जिसे अमूर्त तरीकों की एक जोड़ी में संकलित किया गया है) और एक ठोस var के बीच अंतर कर सकते हैं, जिसे वर्ग फ़ाइल में फ़ील्ड उत्पन्न करने की भी आवश्यकता होती है। –

4

स्काला के साथ "स्ट्रिंग चर नाम" कोई समस्या नहीं है। क्या तुमने कोशिश की? इसका मतलब यह नहीं है कि आप इसका क्या मतलब चाहते हैं, हालांकि। यह एक अमूर्त var है।

abstract class A { 
    var name: String 
} 
// some possible uses for abstract vars 
trait B { type T ; var name: T } 
class B1 extends B { type T = Int ; var name: Int = 5 } 
// hey, no storage 
class B2 extends B { type T = String ; def name = "abc" ; def name_=(x: String) =() } 
+0

अगर मैं सिर्फ var नाम घोषित करता हूं: स्ट्रिंग; जब एक .class फ़ाइल में संकलित किया गया है, स्कैला संकलक शिकायत करेगा: परिवर्तनीय नाम परिभाषित नहीं किया गया है। तो मैं डिजाइन मुद्दों के कारण भी जानना चाहता हूं, क्यों स्कैला var नाम का उपयोग करने की अनुमति नहीं देता है: कक्षा के शरीर में स्ट्रिंग को प्रारंभिक मूल्य घोषित किए बिना; यह एक डिफ़ॉल्ट मान हो या जो भी –

+1

हो, आप मेरा उत्तर दोबारा पढ़ सकते हैं, जिसे आपने अनदेखा किया है। क्या आप पूछ रहे हैं क्यों "अमूर्त" मौजूद है? एक अनुपूरक अमूर्त सदस्य का मतलब है कि आप कक्षा को तुरंत चालू नहीं कर सकते हैं। यह जावा में की तरह डिजाइन द्वारा है। – extempore

18

आप निम्नलिखित आप की घोषणा कर रहे हैं की तरह कोड का उपयोग करते हैं, कि name सार होना चाहिए:

class A { 
    var name: String 
} 

मुझे लगता है आप पहले से ही है कि पता था। तो आपका सवाल वाक्य रचनात्मक प्रकृति के बजाय है। जवाब अन्य संभावित सार उम्मीदवारों साथ निरंतरता है।

मान लीजिए आप इस तरह कुछ करना चाहता हूँ:

class A { 
    var variable: String = _ // variable has some default value (probably null) 
    val value: String = _ // value cannot have any default values, since it cannot be reassigned later. 
    def method: String = _ // method could return some default value (probably null) 
    type theType = _ // what should the default type be? (Any perhaps?) 
} 

पिछले तीन उदाहरण भी संकलन नहीं है। , देखने के लिए मेरे दृष्टिकोण से

class A { 
    var variable: String 
    val value: String 
    def method: String 
    type theType 
} 

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

मैं इससे आपके प्रश्न का और खुश कोडिंग उत्तर देता है उम्मीद है।

+1

आपके उत्तर के लिए धन्यवाद (+1) –

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

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