2012-11-16 15 views
8

में एक ऑब्जेक्ट का विस्तार करना मुझे नियम ऑब्जेक्ट नामक आधार वस्तु मिली है और एक ऑब्जेक्ट जिसे RuleObjectString कहा जाता है। मेरे पास RuleObjectString में एक नई विधि है जिसे मैं उस कोड का उपयोग करने के लिए अपने कोड में कॉल करना चाहता हूं। लेकिन मुझे त्रुटि मिलती है। 'ऑब्जेक्ट विधि का पता नहीं लगा सकता "तुलना करें" पैकेज "के माध्यम से" नियम "पर ./testobject.pl लाइन 10 पर। लेकिन मैं नियम नियम नहीं बना रहा हूं। मैं एक नियम ऑब्जेक्टस्ट्रिंग बना रहा हूं। मुझसे यहां क्या गलत हो रहा है?पर्ल

testobject.pl

1 #! /usr/bin/perl 
    2 
    3 use strict; 
    4 
    5 use RuleObjectString; 
    6 
    7 my $s = RuleObjectString->new(); 
    8 $s->value('stuff goes here'); 
    9 
10 if ($s->compare('stuff')){ 
11   print "MATCH!\n"; 
12 }else{ 
13   print "no match :(\n"; 
14 } 

RuleObject.pm

package RuleObject; 

our @ISA = qw/Exporter/; 
our @EXPORT = qw/new/; 

use strict; 

sub new{ 
     my $class = shift; 

     my $self; 
     $self->{value} = undef; 

     bless $self; 
     return $self; 
} 

sub value{ 
     my $self = shift; 
     my $value = shift; 
     if ($value){ 
       $self->{value} = $value; 
     }else{ 
       return $self->{value}; 
     } 
} 

RuleObjectString.pm

package RuleObjectString; 

our @ISA = qw/RuleObject/; 
our @EXPORT = qw/compare/; 

use strict; 

sub compare{ 
     my $self = shift; 
     my $compareto = shift; 

     return $self->value() =~ /$compareto/; 
} 
+6

आपको अपनी कक्षा और उदाहरण विधियों को 'निर्यात' नहीं करना चाहिए, और आपके मॉड्यूल को आम तौर पर 'निर्यातक' का उत्तराधिकारी नहीं होना चाहिए जब तक कि उनके पास निर्यात करने के लिए पर्याप्त प्रक्रियात्मक कार्य नहीं होते हैं। – pilcrow

+0

और उन मामलों के लिए जहां आपको * फ़ंक्शंस * निर्यात करने की आवश्यकता है, 'उप :: निर्यातक' 'निर्यातक' की तुलना में बहुत अच्छा इंटरफ़ेस है। लेकिन आपको शायद उन पैकेजों से कार्यों को निर्यात करने से बचना चाहिए जो कक्षा परिभाषाएं भी हैं। ' –

उत्तर

12

मुझे लगता है कि jmcneirney सही रास्ते पर है। अपने RuleObject निर्माता में, आप कह

bless $self; 

जो

bless $self, __PACKAGE__; 

या

bless $self, 'RuleObject' 

लेकिन रूप में ही है क्या आप चाहते हैं एक RuleObjectString के रूप में धन्य करने के लिए वस्तु के लिए है। तो क्या आप क्या करना चाहते कहना

bless $self, $class 

अब है

RuleObject->new() 
RuleObjectString->new() 

दोनों एक ही निर्माता फोन होगा, लेकिन वस्तु पहली कॉल द्वारा लौटाए गए एक RuleObject के रूप में धन्य हो जाएगा और दूसरी वस्तु हो जाएगा RuleObjectString के रूप में आशीर्वादित।

+0

यह चाल है! धन्यवाद! – Mike

0

वस्तु डंपिंग प्रयास करें और देखें कि यह क्या है।

print Dumper($s) 

यह एक नियम ऑब्जेक्ट होने जा रहा है।

आपको नियमऑब्जेक्टस्ट्रिंग में एक नया() परिभाषित करने की आवश्यकता हो सकती है और इसे सुपर :: नया() कहते हैं।

+0

आवश्यक नहीं है; बग जैसा कि पहले टिप्पणी की गई है। अर्थात्, कॉलिंग पैकेज में आशीर्वाद देने के लिए अयोग्य 'आशीर्वाद() 'का उपयोग, क्लास नाम प्रदान नहीं किया गया है। – LeoNerd

5

यह 2012 है, इसलिए आपको फिर से पहिया को फिर से शुरू करने के बजाय उचित ओओपी समाधानों का उपयोग करने पर विचार करना चाहिए।

RuleObject.pm

package RuleObject; 
use Moose; 

has 'value' => (isa => 'Str', is => 'rw', required => 0, default => ''); 

1; 

RuleObjectString.pm

package RuleObjectString; 
use Moose; 

extends 'RuleObject'; 

sub compare { 
    my $self  = shift; 
    my $compareto = shift; 

    return $self->value =~ /$compareto/; 
} 

1; 

सरल:

Moose का उपयोग करके, समाधान कुछ इस तरह (untested) लगेगा! :)

+2

और जो लोग सोचते हैं कि 'मूस' बहुत भारी है, 'मू' बहुत अच्छा हल्का विकल्प है। –

+1

क्या यह समझना अच्छा नहीं है कि भाषा कैसे काम करती है और केवल लाइब्रेरी समाधानों पर भरोसा नहीं करती है? (यह 2014 और दुनिया डेवलपर्स के साथ लगभग खत्म हो गया है।) – jackyalcine

+0

ओपी एक विशिष्ट समस्या को हल करना चाहता था, पर्ल सीख नहीं। पुस्तकालय एक अच्छे कारण के लिए हैं। :) – toreau