2011-08-29 14 views
10

मेरे पास एक कक्षा है जहां मैं id विशेषता पर स्ट्रिंग ओवरलोडिंग लागू करना चाहता हूं। हालांकि, मूस विशेषता एक्सेसर्स पर स्ट्रिंग ओवरलोडिंग की अनुमति नहीं देता है। उदाहरण के लिए:मूस विशेषता एक्सेसर पर ओवरलोड को स्ट्रिंग करने का सबसे अच्छा तरीका क्या है?

package Foo; 
use Moose; 
use overload '""' => \&id, fallback => 1; 
has 'id' => (
    is => 'ro', 
    isa => 'Int', 
    default => 5, 
); 

package main; 
my $foo = Foo->new; 
print "$foo\n"; 

ऊपर एक त्रुटि दे देंगे:

You are overwriting a locally defined method (id) with an accessor at C:/perl/site/lib/Moose/Meta/Attribute.pm line 927 

मैं विकल्पों में से एक जोड़े की कोशिश की है इस के आसपास पाने के लिए:

  1. idis => bare अंकन, और यह जगह मेरे अपने एक्सेसर के साथ: sub id {$_[0]->{id}}। लेकिन यह सिर्फ एक हैक है।

  2. स्ट्रिंग ओवरलोडर एक और विधि का उपयोग करते हैं जो सिर्फ आईडी पर वापस भेजता है: sub to_string {$_[0]->id}

मैं सोच रहा हूं कि किसी के पास ऐसा करने का बेहतर तरीका है या नहीं?

उत्तर

7
use overload '""' => sub {shift->id}, fallback => 1; 

मेरे लिए ठीक काम करता है।

+0

अनिवार्य विकल्प 2 है जहाँ से

use overload '""' => 'id', fallback => 1; 

छोटे वाक्यविन्यास में सवाल से। मैं यह नहीं कह रहा कि यह बुरा है लेकिन यह जानना दिलचस्प होगा कि सवाल से पहला दृष्टिकोण क्यों विफल रहता है। – musiKk

+0

छोटा वाक्यविन्यास थोड़ा क्लीनर है। 3 तर्क मुद्दे के साथ, मुझे लगता है कि यह जाने का रास्ता होना चाहिए। – stevenl

5

मेरा मानना ​​है कि आपको कोई त्रुटि मिल रही है क्योंकि \&id बाद में परिभाषित करने के लिए उप-स्थान के लिए प्लेसहोल्डर बनाता है, क्योंकि पर्ल को उस पते को जानने की आवश्यकता होगी, जब इसे संदर्भित करने के लिए परिभाषित किया गया हो। मूस के पास आपके द्वारा परिभाषित ओवरराइटिंग विधियों से बचने की कोशिश करने के लिए स्वयं की जांच है और यह आपको रिपोर्ट करता है।

के बाद से मुझे लगता है कि आप वास्तव में क्या करने के लिए फोन है id विधि चाहते हैं जब वस्तु इतनी तरह एक स्टिंग के रूप में प्रयोग किया जाता है: overload documentation

Values specified as strings are interpreted as method names.

+0

यह काम नहीं करता है। मुझे अभी भी त्रुटि संदेश मिल रहा है: 'रीडर फू :: आईडी (परिभाषित एट-लाइन 4) लाइन 3 Foo :: id (' Foo = HASH (0x12ffa10) 'पर एक रीड-ओनली एक्सेसर को मान असाइन नहीं किया जा सकता है, undef , '') को लाइन 12' –

+0

@ हिनिक कहा जाता है, ऐसा लगता है कि 'अधिभार' विधि को पैरामीटर पास कर रहा है, जो मूस विशेषता को सेट करने के प्रयास के रूप में व्याख्या करता है। तो आपको एक मध्यस्थ उप का उपयोग करने की आवश्यकता होगी, जैसा कि आपने अपने उत्तर में किया था। – cjm

+4

मुझे लगता है कि यह त्रुटि इसलिए है क्योंकि 'अधिभार' हमेशा [ओवरलोड - कॉलिंग सम्मेलनों] से विधि में 3 तर्क पास करता है (https://metacpan.org/module/overload#Calling-Conventions-and-Magic-Autogeneration) – stevenl

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