2016-08-03 8 views
6

गुणों को आलसी बनाने का सबसे अच्छा तरीका क्या है?आलसी एक्सेसर्स कैसे लिखें

class I { 
    has $!cheezeburger; 

    method cheezeburger { 
     given $!cheezeburger { 
      when .so {return $_} 
      default { 
       # build $cheezeburger, set attribute to it, return 
      } 
     } 
    } 
} 

यह बहुत सारे चीजबर्गर है। कम verbose रास्ता क्या हो सकता है?

+4

'विधि चीजबर्गर {$! चीजबर्गर // = ...} ' –

उत्तर

2

व्यावहारिक समाधान ब्रैड द्वारा दिए गए उस विशेषता अगर यह कई मामलों के लिए अच्छा होना चाहिए अपरिभाषित है initializes:

class Foo { 
    has $!cheezeburger; 
    method cheezeburger { 
     $!cheezeburger //= do { ... } 
    } 
} 

एक और दृष्टिकोण does का उपयोग करेंगे के दौरान एक भूमिका में मिश्रण से एक्सेसर विधि को बदलने के लिए अपनी पहली कॉल, निजी विशेषता का उपयोग करने के काला जादू (उर्फ NQP ऑप्स) का उपयोग:

class Foo { 
    has $!cheezeburger; 
    method cheezeburger { 
     self does role { 
      method cheezeburger { 
       use nqp; 
       nqp::getattr(self, Foo, '$!cheezeburger'); 
      } 
     } 
     $!cheezeburger = do { ... } 
    } 
} 
+0

मुझे परिभाषित-या-बराबर के साथ 'do' ब्लॉक पसंद है – beasy

4
class A { 
    has $!lazy; 
    method BUILD { $!lazy := Nil }; 
    method lazy { $!lazy := (my $a = 42) if $!lazy =:= Nil; $!lazy } 
}; 
my $a = A.new; 
say [$a.lazy, $a.lazy]; 

तो $!lazy अपरिभाषित मूल्यों आप कुछ छोरों के माध्यम से कूद करने की जरूरत है पकड़ के लिए है। सबसे पहले हम Nil से $!lazy पर एक कंटेनर को पकड़ने में सक्षम नहीं होना चाहिए। यदि $!lazy अभी भी Nil तक बाध्य है तो हम एक नया कंटेनर बनाते हैं और इसके लिए एक मान निर्दिष्ट करते हैं। यदि मूल्य अपरिवर्तनीय है, तो आपको अतिरिक्त कंटेनर की आवश्यकता नहीं है। किसी भी प्रकार की बाधा आपको $ पर चाहिए! आलसी $a पर होने की आवश्यकता है क्योंकि बाधाएं एक कंटेनर की संपत्ति हैं जो चर/वर्ग-संपत्ति नहीं है।

+0

: \ अभी भी इसे समझने पर काम कर रहा है। सामग्री के लिए thx – beasy

+2

वेरिएबल कंटेनर (असाइनमेंट ऑपरेटर '=' के माध्यम से) और अपरिवर्तनीय मानों (बाइंड ऑपरेटर के माध्यम से ': = ') से जुड़ सकते हैं। यह समझने के लिए कि कौन से कंटेनर https://docs.perl6.org/language/containers#Custom_containers देखते हैं। –

4

मौजूदा मॉड्यूल

दो lazy attribute modules हैं।

साधारण कोड

ब्राड की $!cheezeburger //= do { ... }; एक काफी सीधी-सपाट समाधान है कि कई उपयोग के मामलों के लिए पर्याप्त करेंगे की तरह लगता है।

कुछ बेहतर?

आप पाते हैं कि # perl6 लोक चाहते हैं या कुछ बेहतर प्रदान कर सकते हैं।

सबसे हालिया गंभीर # perl6 चर्चाएं मुझे आलसी विशेषता प्रारंभिकरण के बारे में पता है, 2015 के दौरान 5 मई, 7 वीं, 20 वीं और 5 जून, 8 वीं और 20 वीं के दौरान हुई थी। pages of #perl6 log with at least one "will lazy" match में "आलसी" के लिए खोजें। टीएल; इन चर्चाओं में से डीआर यह है कि आरजेबीएस, एमएसटी और अन्य मूस उपयोगकर्ताओं का उपयोग आलसी विशेषता प्रारंभ करने के लिए किया जाता था और राकुडो में एक समाधान जोड़ा गया था; इसके बाद इसका समर्थन किया गया क्योंकि मस्क और अन्य लोगों ने सोचा कि इसमें समस्याएं थीं और उन्होंने सोचा कि मॉड्यूल स्पेस में अच्छे समाधान बनाए जा सकते हैं और फिर समझ में आने पर कोर में वापस चले गए।

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