在Perl中扩展对象

时间:2012-11-16 18:22:14

标签: perl object

我有一个名为RuleObject的基础对象和一个从名为RuleObjectString的继承对象。我在RuleObjectString中有一个新方法,我想在我使用该对象的代码中调用它。但是我得到了错误。 '找不到对象方法“比较”通过包“RuleObject”在./testobject.pl第10行。'但我不是在创建一个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/;
}

3 个答案:

答案 0 :(得分:12)

我认为jmcneirney走在正确的轨道上。在RuleObject构造函数中,您说

bless $self;

相同
bless $self, __PACKAGE__;

bless $self, 'RuleObject'

但你想要的是让对象成为RuleObjectString祝福。所以你要做的就是说

bless $self, $class

现在

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

将同时调用相同的构造函数,但第一个调用返回的对象将被祝福为RuleObject,第二个对象将被祝福为RuleObjectString

答案 1 :(得分:5)

这是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;

简单! :)

答案 2 :(得分:0)

尝试转储对象并查看它是什么。

print Dumper( $s )

它将成为一个RuleObject。

您可能需要在RuleObjectString中定义new() 并让它调用Super :: new()。