2011-12-21 13 views
15

स्काला में 2.9.1 मैं निम्नलिखित व्यवहार मिलता है:स्काला: साथी वस्तु के लिए परिभाषा के आदेश बनाम मामले वर्ग

class Foo { 
    case class X() 
    object X   // this compiles 

    def bar() { 
     object Y   // this compiles 
     case class Y() 

     case class Z() 
     object Z   // won't compile (see below) 
    } 
} 

संकलक Object Z के लिए शिकायत: त्रुटि: जेड पहले से ही के रूप में (संकलक उत्पन्न परिभाषित किया गया है) मामले वर्ग साथी वस्तु जेड

ऐसा लगता है कि यह अगर वे एक समारोह परिभाषा के दायरे में हैं मामले वर्ग परिभाषा के बाद एक मामले वर्ग के लिए एक साथी वस्तु को परिभाषित करने की अनुमति नहीं है। क्या यह एक कंपाइलर बग, या जानबूझकर है? अगर उत्तरार्द्ध, क्यों?

उत्तर

12

यह एक ज्ञात बग है: SI-3772: companions and method-owned case classes। यह आंशिक रूप से तय है, लेकिन ओपी का मुद्दा अभी भी बना हुआ है। यदि आप इसे ठीक करना चाहते हैं तो इसे वोट दें।

+0

यह बहुत आस-पास काम करने के लिए आसान है, इसलिए मैं इसे मतदान के लायक है यकीन नहीं है। टिकट के लिंक के लिए धन्यवाद। –

1

कारण है कि पहले की अनुमति दी है और दूसरा नहीं है वर्गों और वस्तुओं आगे परिभाषाएँ हो सकता है है, लेकिन परिभाषाएँ नहीं कर सकता। तो संकलक के लिए object X को केस क्लास द्वारा परिभाषित किए गए मिश्रण के साथ क्यों संभव है, दूसरे मामले में ऐसा करना संभव नहीं है।

मुझे आश्चर्य है कि क्या Y मामले में होता है: छाया या वस्तु साथी बिल्कुल जेनरेट नहीं होता है?

+0

रुको, क्या? :-) क्या आपका मतलब था "कक्षाओं और वस्तुओं में आगे की परिभाषाएं हो सकती हैं, लेकिन ** विधियां ** नहीं कर सकतीं"? –

+1

@GregorScheidt न तो विधियां और न ही कार्य। खैर, स्कैला स्पेक नहीं जानता कि "विधि" क्या है, इसलिए मैं उन्हें कार्यों को भी कॉल कर सकता हूं, लेकिन मुझे "फ़ंक्शन" के आसपास नाम भ्रम से नफरत है। –

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