2015-10-12 23 views
6

में केवल 1 तर्क के साथ एक कन्स्ट्रक्टर मैं new को ओवरराइड करना चाहता हूं ताकि मेरी कक्षा केवल एक कन्स्ट्रक्टर को तर्क देकर बनाई जा सके, और अधिक नहीं।पर्ल 6

class MyClass { 
    has $.var1; 

    method new($var1) { 
    return MyClass.new(var1 => $var1); 
    } 
} 

my $my_class1 = MyClass.new(33); 
say $my_class1.var1; 

त्रुटि है:

Too few positionals passed; expected 2 arguments but got 1 
    in method new at test1.pl6:28 
    in method new at test1.pl6:28 
    in block <unit> at test1.pl6:33 

यह साथ क्या है?

उत्तर

10

कस्टम कंस्ट्रक्टर्स, bless कॉल करने की आवश्यकता यानी

class MyClass { 
    has $.var1; 

    method new($var1) { 
     return self.bless(var1 => $var1); 
    } 
} 

कुछ चीजें है कि सुधार किया जा सकता है, जैसे

  • एक एक स्पष्ट invocant पैरामीटर जोड़ने और :U का उपयोग .new() असफल बनाने के लिए कर सकता है जब उदाहरण वस्तुओं पर बुलाया जाता है
  • स्पष्ट return अनिवार्य है - विधि के भीतर अंतिम अभिव्यक्ति वैसे भी वापस की जाएगी, और वर्तमान में, यह वास्तव में दर्द होता है प्रदर्शन
  • वहाँ एक साथ एक ही नाम

के एक चर में आयोजित एक नामित तर्क यह सब लाना पारित करने के लिए वाक्यात्मक चीनी है, हम ऊपर

class MyClass { 
    has $.var1; 

    method new(MyClass:U: $var1) { 
     self.bless(:$var1); 
    } 
} 

जहां के रूप में के साथ समाप्त आपकी त्रुटि से आता है:

आपकी विधि new को एक स्थितित्मक तर्क लेने के लिए घोषित किया गया है (निहित आक्रमणकर्ता के कारण 2 अपेक्षित तर्कों की कुल गणना), लेकिन MyClass.new(var1 => $var1) पर कॉल करें ly एक नामित एक पारित किया। ध्यान दें कि कहा गया है कि विधि आपकी कक्षा में केवल .new() मौजूद है, इसलिए यदि कॉल वास्तव में काम करता था, तो आप अनंत रिकर्सन के साथ समाप्त हो जाते!

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