2012-05-12 18 views
6

के साथ गंभीर रूप से नकली "तर्क नहीं लेता" त्रुटि है मेरे पास एक केस क्लास है जिसमें उसके कन्स्ट्रक्टर के लिए कुछ पैरामीटर हैं, और मैं एक साथ क्लास ऑब्जेक्ट को परिभाषित करता हूं जो वैकल्पिक कन्स्ट्रक्टर को परिभाषित करता है जो तर्कों का एक अलग सेट लेता है, इसलिए जैसे:केस क्लास कन्स्ट्रक्टर

object SomeStuff { 
    def problem (s: String) { 
    assert(!s.isEmpty) 

    val zero = MyClass('a', Nil) 

    val mc2 = "Pillsy Pillsy Pillsy" foldRight(zero) { 
     MyClass(_, List(_)) 
    } 
    } 
} 

जब मैं ऐसा करते हैं, मैं संकलक से एक त्रुटि संदेश मिलता है:: "MyClass

case class MyClass (c: Char, mc: List[MyClass]) 

object MyClass { 
    def apply(c: Char, mc: MyClass): MyClass = { 
    MyClass(c, List(mc)) 
    } 
} 

मैं एक foldRight में मूल मामले वर्ग निर्माता का उपयोग करना चाहते पैरामीटर नहीं लेता है। " अगर मैं val mc2 = ... सेक्शन पर टिप्पणी करता हूं तो यह समस्या दूर हो जाती है, लेकिन MyClasszero की परिभाषा में स्पष्ट रूप से पैरामीटर ले रहा है। मुझे लगता है कि मुझे कुछ मूलभूत याद आना चाहिए, लेकिन मुझे नहीं पता कि यह क्या है। मैंने foldRight के दूसरे तर्क के रूप में उपयोग करने के लिए एक सहायक विधि या फ़ंक्शन वैल्यू को परिभाषित करने जैसे कुछ कामकाज की कोशिश की है, लेकिन इसमें से कोई भी मदद नहीं करता है, जो कि आश्चर्यजनक नहीं है क्योंकि मैं मूल रूप से यादृच्छिक रूप से घूम रहा हूं।

उत्तर

5

पहले, foldRight दो तर्क लेता है, तो आप ऑपरेटर संकेतन का उपयोग नहीं कर सकते हैं (अपने मौजूदा रूप में), लेकिन आप कर सकते हैं:

("foo" foldRight zero) { ... } 

या वैकल्पिक रूप से,

("foo" :\ zero) { ... } 

दूसरा, { MyClass(_, List(_)) }

{ x => MyClass(x, y => List(y)) } 

में desugar होगा, तो आपको एक नाम देना चाहिए

"Pillsy Pillsy Pillsy".foldRight(zero) { (c, mc) => 
    new MyClass(c, List(mc)) 
} 

या पूरक apply विधि का उपयोग करता है, तो आप को अंडरस्कोर से जाना चाहता हूँ: rguments और new कीवर्ड का उपयोग कि निर्माता यह सुनिश्चित करने के apply विधि के बजाय कहा जाता है

"Pillsy Pillsy Pillsy".foldRight(zero) { MyClass(_, _) }