2009-12-07 18 views
8

के रूप में लौटा दी गई है मेरे पास एक मरो क्लास है जो एक एरेरेफ (केवल पढ़ने के लिए) है और ऑब्जेक्ट द्वारा आंतरिक रूप से छेड़छाड़ की जाती है। लेकिन जब कोई एक्सेसर विधि कहता है तो मैं चाहता हूं कि वह एक ऐरे (या सूची) को संदर्भ न दे। न केवल इस बात को अस्वीकार कर दिया जाएगा कि कक्षा के उपयोगकर्ता को क्या करना है, लेकिन इसका मतलब यह होगा कि वे मेरे ऑब्जेक्ट का उपयोग कर रहे उसी रेफरी के साथ गलती से छेड़छाड़ नहीं कर सकते हैं।मूस ArrayRef विशेषता एक ऐरे

तो ऐसा करने का सबसे अच्छा तरीका क्या है? कुछ प्रकार का जबरदस्ती?

has my_field => (
    is => 'ro', isa => 'ArrayRef[Str]', 
    auto_deref => 1, 
    # rest of options... 
); 

ध्यान दें कि कभी कभी आप जब पाठक पद्धति का उपयोग करके, अभिव्यक्ति की अदिश या सूची संदर्भ के आधार पर वापस एक सरणी नहीं मिलेगा:

उत्तर

17

Moose::Meta::Attribute::Native::Trait::Array और प्रतिनिधिमंडल का उपयोग करें, उदा।

handles => { my_array => 'elements' } 

auto_deref अभी भी एक संदर्भ लौटने अगर आप अदिश संदर्भ में एक्सेसर फोन की अवांछनीय व्यवहार है (#moose पर doy के माध्यम से)।

+2

'auto_deref' (मूस गिट में) के लिए दस्तावेज़ अब यह स्पष्ट करते हैं। – hdp

3

auto_deref विकल्प का उपयोग करें। कुछ समय पहले मैं एक ऐसी स्थिति में भाग गया जहां मुझे काम करने के लिए डिफ्रेंसिंग प्राप्त करने के लिए स्पष्ट रूप से अभिव्यक्ति में सरणी संदर्भ लाया गया था .. यदि मैं इसे पा सकता हूं तो मैं एक उदाहरण जोड़ूंगा।

+1

धन्यवाद, मैंने दस्तावेज़ों को देखा, लेकिन जाहिर है कि यह स्पष्ट रूप से मेरी आंखों से छोड़ा गया था :) – mpeters

6

जबकि आप auto-deref का उपयोग कर सकते हैं, Moose::Manual::BestPractices कहता है कि यह करने का यह सबसे अच्छा तरीका नहीं है, और आपको उस कार्यक्षमता को पूरा करने के लिए Moose::Meta::Attribute::Native का उपयोग करने पर विचार करना चाहिए।

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