Perl - SUPER - Не удается найти метод объекта - PullRequest
2 голосов
/ 15 июля 2011

Я создал следующие 2 файла, но когда я запускаю sample.pl, он выдаёт мне следующую ошибку Can't locate object method "new" via package "sample" at sample.pm line 14.

Любая помощь приветствуется.

Спасибо.

package sample;

use strict;

sub new {
    my $proto = shift;
    my $class = ref($proto) || $proto;
    my %fields = (
                   Debug => 0,
                   Error => undef,
                   @_,
                );

    my $self = bless $proto->SUPER::new(%fields), $class;
    return $self;
}

1;

sample.pl

#!/usr/bin/perl
use strict;
use sample;

my $obj = sample->new();

print "Howdy, sample\n";

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Псевдокласс SUPER относится к родительскому классу пакета, в котором он появляется (а не к родительскому классу объекта, который его вызывает!). У вас нет родительского класса. Добавьте родительский класс, чтобы увидеть, как он работает. Вот пример с несколькими модификациями.

#######################
package ParentSample;
use strict;
use warnings;

sub new {
    my( $class, %fields ) = @_;
    # some debugging statements so you can see where you are:
    print "I'm in ", __PACKAGE__, " for $class\n";

    # make the object in only one class
    bless \%fields, $class;
    }

#######################
package Sample;
use strict;
use warnings;

use base qw(ParentSample);

sub new {
    my( $class ) = shift;
    # some debugging statements so you can see where you are:
    print "I'm in ", __PACKAGE__, " for $class\n";

    my %fields = (
                   Debug => 0,
                   Error => undef,
                );

    # let the parent make the object
    $class->SUPER::new( %fields );
}

#######################
package main;
use strict;
use warnings;

my $obj = Sample->new( cat => 'Buster' );

print "Howdy, sample\n";

Любопытно, что это сообщение об ошибке стало намного лучше в последних версиях Perl. Ваш старый Perl не помещает SUPER в сообщение:

$ perl5.8.9 sample
Can't locate object method "new" via package "sample" at sample line 14.
$ perl5.10.1 sample
Can't locate object method "new" via package "sample" at sample line 14.
$ perl5.12.1 sample
Can't locate object method "new" via package "sample::SUPER" at sample line 14.
$ perl5.14.1 sample
Can't locate object method "new" via package "sample::SUPER" at sample line 14.
1 голос
/ 26 марта 2015

Вместо использования базы вы также можете изменить массив @ISA и загрузить модуль самостоятельно:

Итак

use base "ParentSample";

можно заменить на:

require ParentSample;
@ISA = ("ParentSample");

При изменении @ISA важен модуль загрузки, иначе он не будет работать. Базовая нагрузка для вас.

1 голос
/ 15 июля 2011

У вас нет файла use base в вашем файле sample.pm - он не наследует какой-либо другой пакет - кем, как вы ожидаете, будет $proto->SUPER?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...