2011-10-12 18 views
7

बेवकूफ सवाल मेरा मानना ​​है, लेकिन मुझे लगता है कि बस अन्य रचनाकारों को कन्स्ट्रक्टर से बुला रहा है। मुझे एक विधि कॉल करने की जरूरत है। मेरी कक्षा (शुरुआत):कन्स्ट्रक्टर में कुछ कार्रवाई कैसे जोड़ें?

class ScopedIterator[T](val iter : Iterator[T]) 
{ 
    private var had_next : Boolean; 
    private var value : T; 

    moveNext(); 

    ... 

तो मैं एक तर्क के साथ एक निर्माता करना चाहते हैं, और इस तरह निर्माता में एक विधि moveNext कहते हैं। बस इतना ही।

error: abstract member may not have private modifier

private var had_next : Boolean;

और मूल्य के लिए एक ही:

जब मैं कोड संकलन मैं त्रुटि मिलती है।

मैं करने के लिए इसे बदल दिया है:

class ScopedIterator[T] 
{ 
    private var had_next : Boolean; 
    private var value : T; 
    private var iter : Iterator[T]; 

    def this(it : Iterator[T]) = 
    { 
    iter = it; 
    moveNext(); 
    } 

    ... 

लेकिन अब मैं "आईटीईआर = यह" पर त्रुटि मिलती है:

error: 'this' expected but identifier found.

iter = it;

कैसे स्काला में इस तरह के निर्माता लिखने के लिए?

+0

विशेष रूप से आपको 'iter = it' पर क्या त्रुटि मिलती है? – asm

+0

@ एंड्रयू मायर्स, क्षमा करें, अपडेट किया गया। – greenoldman

उत्तर

18

पहली समस्या है कि had_next और value की अपनी परिभाषा के सार हैं: इन सदस्यों कोई दाएँ हाथ की ओर है।

बजाय का प्रयास करें:

class ScopedIterator[T](val iter : Iterator[T]) { 
    private var had_next : Boolean = _ 
    private var value : T = _ 
    ... 
} 

यहाँ, _ का अर्थ है "डिफ़ॉल्ट अप्रारंभीकृत मूल्य"। उदाहरण के लिए, कंसोल में मेरे लिए निम्नलिखित काम करता है:

class ScopedIterator[T](val iter : Iterator[T]) { 
    private var had_next : Boolean = _ 
    private var value : T = _ 

    init() 

    def init() : Unit = { println("init !") } 
} 

scala> new ScopedIterator(List(1,2,3).toIterator) 
init ! 
resN: ScopedIterator[Int] = ... 

दूसरी समस्या (" 'इस' की उम्मीद ...") आता है क्योंकि स्काला में, सहायक कंस्ट्रक्टर्स हमेशा अपने पहले के रूप में एक और निर्माता कॉल करना होगा बयान। तो उदाहरण के लिए, आपका कन्स्ट्रक्टर this() से शुरू हो सकता है। अधिक जानकारी के लिए, Programming in Scala में सेक्शन 6.7 देखें।

+0

धन्यवाद, मुझे उम्मीद नहीं थी कि मुझे भी संश्लेषित किया जाना है " निर्माता "। – greenoldman

6

डिफ़ॉल्ट निर्माता जब आप यह घोषणा अपनी कक्षा

पूर्व एक आपके द्वारा निर्धारित है:

class greeting(name:String) { ... } 

आप भी अपने कोड में की तरह कोई पैरामीटर नहीं करने के लिए डिफ़ॉल्ट निर्माता को परिभाषित कर सकते

class greeting { ... } 

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

एक उदाहरण देखते हैं:

class classconstructor { 
    var iter:Int = 0  
    def this(it:Int) = {  
     this() 
     iter = it; 
     moveNext(); 
    } 
    def moveNext() = { 
     println(iter) 
    } 
} 

object App 
{ 
    def main(args:Array[String]) 
    { 
     val x = new classconstructor() 
     val y = new classconstructor(200)  
    } 
} 

नई classconstructor उपरोक्त कोड में(), क्योंकि खाली निर्माता शरीर नहीं है कुछ नहीं करता है। और नया क्लासकॉन्स्ट्रक्टर (200) खाली कन्स्ट्रक्टर निष्पादित करता है + नया वह स्थान जहां आप अतिरिक्त कोड जोड़ सकते हैं जैसे आगे बढ़ने के लिए कॉल() विधि। इस मामले में यह कंसोल पर 200 प्रिंट करता है।

+0

दोनों उत्तर महान हैं, और कुल मिलाकर सभी मुद्दों को कवर करते हैं। हालांकि मैं केवल उत्तर के रूप में चिह्नित कर सकता हूं :-(मुझे उम्मीद है कि आपको कोई फर्क नहीं पड़ता है, फिर भी मैं आभारी हूं। – greenoldman

+0

आपका स्वागत है। कोई चिंता नहीं। –