2014-11-05 8 views
5

मैं स्कैला के लिए नौसिखिया हूं। Here एक Models.scala है जिसे मैं लिखने की कोशिश कर रहा हूं। जब मैं एसबीटी पैकेजस्कैला केस क्लास। टाइप पैरामीटर नहीं लेता

Models.scala:25: models.Session.Network.type does not take parameters 
[error]   network : Network = Network() , 

मुझे समझ नहीं आता क्यों इस त्रुटि हो रही है, मैं किसी भी पैरामीटर गुजर नहीं कर रहा हूँ जब नेटवर्क करने में यह त्रुटि दे रहा है चलाते हैं()। क्या कोई मेरी मदद कर सकता है

उत्तर

0

ऐसा लगता है कि आपके पास कुछ आयात ओवरराइड चल रहे हैं। क्या आपके पास कोड में कुछ सत्र हैं ._ कोड में? ध्यान दें कि आपकी त्रुटि सत्र.नेटवर्क को संदर्भित करती है, जो आपकी निहित बीएसओएन डॉक्यूमेंट क्लास है। आप शायद सादे केस वर्ग बनाने की कोशिश कर रहे हैं।

स्पष्ट रूप से नेटवर्क का उपयोग कर प्रयास करें: नेटवर्क: models.Network = models.Network()

2

यहाँ एक छोटे कोड है कि आपकी समस्या पुनरुत्पादित करता है:

case class A(b:B = B(3, 5)) 

case class B(i: Int, j: Int) 

object A { 

    val B = "whatever" 
} 

पहली पंक्ति में, हम

मिल
too many arguments for method apply: (index: Int)Char in class StringOps  

क्या होता है कि जब आप केस क्लास के हस्ताक्षर को परिभाषित करते हैं, तो आप दोनों कन्स्ट्रक्टर के हस्ताक्षर (जब आप नए से कॉल करते हैं) को परिभाषित करते हैं, और लागू विधि में साथी वस्तु (जब आप बिना नए के कॉल करते हैं)।

जब आप तर्क में डिफ़ॉल्ट मान डालते हैं, (आपके कोड में नेटवर्क(), और बी (3, 5) मेरा), यह कोड कन्स्ट्रक्टर के संदर्भ में और लागू विधि के दोनों में संकलित किया जाएगा साथी वस्तु।

जैसा कि आपने एक साथी ऑब्जेक्ट सत्र परिभाषित किया है, लागू विधि स्वचालित रूप से इस ऑब्जेक्ट में जोड़ दी जाती है। ऐसा होता है कि आपके साथी ऑब्जेक्ट में नेटवर्क() नेटवर्क नेटवर्क पर नेटवर्क.प्ली() का मतलब है जिसे आपने परिभाषित किया है, और इसका मतलब है कि स्ट्रिंग बी मेरे कोड में "जो भी" मान के साथ है।

वास्तव में अजीब बात यह है कि डिफ़ॉल्ट अभिव्यक्ति के अलग-अलग अर्थ हैं, लेकिन दोनों कन्स्ट्रक्टर और लागू विधि के संदर्भ में सही हैं। इस मामले में, आप इस बात के आधार पर अलग-अलग व्यवहार कर सकते हैं कि आप नए या बिना कॉल करते हैं या नहीं।

यहाँ एक उदाहरण है:

case class A(b:B = bb) 

case class B(i: Int, j: Int) 

object bb extends B(3, 4) 

object A { 

    val bb = new B(7, 2) 
} 


object Test extends App { 

    println(A()) 
    println(new A()) 

} 

चल रहा है परीक्षण

A(B(7,2)) 
A(B(3,4)) 

प्रिंट होगा अपने विशिष्ट समस्या के लिए, वहाँ आसान कामकाज से जुड़े हैं।

network: Network = models.Network(), 

काम करेंगे, जाहिर है, क्योंकि यह तो स्पष्ट है कि आप पैकेज में नेटवर्क चाहते हैं कि और वस्तु सत्र में नहीं।

network: Network = new Network(), 

भी काम करेगा, क्योंकि नए के साथ, कंपाइलर नेटवर्क प्रकार की तलाश करेगा, न कि नेटवर्क मान। साथी ऑब्जेक्ट सत्र में, नेटवर्क मान स्थानीय घोषणा द्वारा छायांकित होता है, लेकिन नेटवर्क का प्रकार नहीं है।

आईएमओ, पूर्व (मॉडल। नेटवर्क) स्पष्ट है।


पीएस। मैंने विनिर्देश की जांच की और मेरा मानना ​​है कि यह अजीब व्यवहार इसके अनुरूप है। अर्थात्, (5.3.2) एक लागू विधि साथी ऑब्जेक्ट के अंदर निर्माता के रूप में समान पैरामीटर सूची के साथ जेनरेट की जाती है। इसमें डिफ़ॉल्ट मान शामिल हैं, जिन्हें बाद में साथी ऑब्जेक्ट के अंदर संकलित किया जाएगा।

+0

मुझे नहीं पता कि यह कल्पना और इरादे के अनुसार है (क्योंकि अन्य व्यवहार निर्दिष्ट या कार्यान्वित करने के लिए बहुत जटिल होंगे)। कल्पना के अनुसार, लेकिन एक निरीक्षण | spec का उल्लंघन। मैं spec की जांच करूंगा और यदि यह अभी भी अस्पष्ट है, तो मेलिंग सूची –

+0

पर पूछें, मुझे विश्वास है कि यह अब विनिर्देश के अनुरूप है। मैंने मेलिंग सूची को फिर भी अधिसूचित किया। –

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