9

RuleObjectというベースオブジェクトと、RuleObjectStringというオブジェクトを継承するオブジェクトがあります。RuleObjectStringに、そのオブジェクトを使用するコードで呼び出す新しいメソッドがあります。しかし、エラーが発生します。'./testobject.pl行10のパッケージ"RuleObject"を介してオブジェクトメソッド"compare"を見つけることができません。' しかし、私はRuleObjectを作成していません。RuleObjectStringを作成しています。私はここで何が間違っているのですか?

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/;
}
4

3 に答える 3

12

jmcneirneyは正しい方向に進んでいると思います。コンストラクターで、あなたRuleObjectは言います

bless $self;

これはと同じです

bless $self, __PACKAGE__;

また

bless $self, 'RuleObject'

しかし、あなたが望むのは、オブジェクトがとして祝福されることRuleObjectStringです。だからあなたがしたいのは言うことです

bless $self, $class

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

両方とも同じコンストラクターを呼び出しますが、最初の呼び出しによって返されるオブジェクトはとして祝福されRuleObject、2番目のオブジェクトはとして祝福されますRuleObjectString

于 2012-11-16T18:37:11.897 に答える
4

これは2012年なので、車輪の再発明をやり直すのではなく、適切なOOPソリューションの使用を検討する必要があります。

Mooseを使用すると、ソリューションは次のようになります(テストされていません)。

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;

単純!:)

于 2012-11-17T11:50:28.370 に答える
0

オブジェクトをダンプして、それが何であるかを確認してください。

print Dumper( $s )

RuleObjectになります。

RuleObjectStringでnew()を定義し、Super :: new()を呼び出す必要がある場合があります。

于 2012-11-16T18:30:53.513 に答える