2009-02-18 12 views
7

Moose::Manual::Attributes कहता है:मूस के निर्माता एक स्ट्रिंग मूल्य क्यों लेते हैं?

[डिफ़ॉल्ट के लिए] एक सबरूटीन संदर्भ का उपयोग कर के लिए एक विकल्प के रूप में, आप के बजाय अपनी विशेषता का बिल्डर विधि आपूर्ति कर सकते हैं: ... यह कई फायदे हैं। सबसे पहले, यह कोड के एक हिस्से को अपनी नामित विधि में ले जाता है, जो पठनीयता और कोड संगठन में सुधार करता है।

has attr => (
    is => 'ro', 
    builder => 'subroutine' 
); 
sub subroutine { 
    # figure out and return default value 
} 

क्यों इस डिफ़ॉल्ट से अलग हो गया है मैं नहीं मिलता है:

तो, अपनी विशेषता एक डिफ़ॉल्ट thusly निर्धारित कर सकते हैं। क्या आप सिर्फ नामित सबराउटिन का संदर्भ नहीं दे सकते?

has attr => (
    is => 'ro', 
    default => \&subroutine 
); 

और होगा कि नहीं बेहतर प्रोग्रामिंग अभ्यास, जब से तुम गलती से एक सबरूटीन जो मौजूद नहीं है का उल्लेख नहीं करने के लिए गारंटी रहे हैं हो सकता है? आप एक प्रतीकात्मक संदर्भ के बजाय एक तार्किक संदर्भ के साथ विधि का जिक्र करेंगे।

उत्तर

14

जब बिल्डर कहा जाता है, ऐसा होता है:

$object->$builder 

तो बिल्डर एक स्ट्रिंग है, तो उपयोगकर्ताओं को एक उपवर्ग में अपने स्वयं के build_attr विधि लिख सकते हैं (के build_attr मान लीजिए) और यह कहा जाएगा। यह एक साधारण नामित विधि तंत्र के माध्यम से डिफ़ॉल्ट मान एक्स्टेंसिबल बनाता है।

यदि यह सबराउटिन का संदर्भ है, तो संदर्भ मूल वर्ग के पैकेज में लिया जाता है, जिसका अर्थ है कि इसे उसी तरह से ओवरराइड नहीं किया जा सकता है।

10

यह एक "प्रतीकात्मक" संदर्भ नहीं है। निर्माता एक विधि नाम है। इसका मतलब है कि यह एक भूमिका से विरासत योग्य और composable है। यदि आप एक सबराउटिन संदर्भ पास करते हैं, तो वह संदर्भ उसी पैकेज में मौजूद होना चाहिए (या पूरी तरह योग्य होना चाहिए)।

मुझे यकीन है कि मैं इसे मैनुअल में समझाता हूं। क्या यह अस्पष्ट है?

+0

अच्छा, मुझे पता है कि यह पर्ल भावना में संदर्भ नहीं है; मैं बस सोच रहा था कि बेहतर प्रोग्रामिंग अभ्यास किसी नामित सबराउटिन के वास्तविक संदर्भ को पारित करने के कारणों के लिए होगा। हालांकि, आप सही हैं; बाकी मैनुअल दिखाता है कि जिस तरह से यह वांछनीय है ... – skiphoppy

+1

पैराग्राफ नोट करें जो शुरू होता है "इसमें कई फायदे हैं। पहले ..."; हो सकता है कि यह अगले कुछ हिस्सों को आगे बढ़ाने के लिए आगे बढ़ने में मदद करेगा ताकि अनुच्छेद केवल एक ही लाभ से अधिक प्रदान करता है, जो सोच रहे हैं उनके लिए थोड़ा जल्द। – skiphoppy

7

सबक्लासिंग।

बिल्डर कॉल करने के लिए एक विधि नाम निर्दिष्ट करता है, तो

package Something; 
use Moose; 

extends 'YourClass'; 

sub subroutine { <some other default> } 

, कुछ :: सबरूटीन 'सबरूटीन' के एक बिल्डर के लिए कहा जाता है के लिए होता है, जबकि यदि आप subref शैली का उपयोग किया तो YourClass :: सबरूटीन होगा इसके बजाय कहा जाता है क्योंकि आपने विधि प्रेषण के माध्यम से जाने के बजाय subroutine का प्रत्यक्ष संदर्भ दिया है।

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