【问题标题】:Perl - Can't locate object method via "Module::SUPER"Perl - 无法通过“Module::SUPER”定位对象方法
【发布时间】:2016-08-29 22:06:04
【问题描述】:

这是我第一次将 OOP 与 perl 一起使用。我正在重构一个工作中的 4k 行程序程序。这看起来很简单,但我遇到了继承和 SUPER 的问题。

错误信息:

"Can't locate object method "New" via package "Module::SUPER" at Module.pm line 10"

我尝试过使用 base、parent 和设置 @ISA,但它们都得到相同的错误。我确定我必须忽略一些东西。

(这不是我正在处理的程序中的代码。只是一个产生相同错误的示例)

在此示例中,所有 .pm 和 .pl 文件都位于同一目录中。在我正在处理的程序中,主程序在 bin 中,模块将在 ../modules(相对于 bin)中。
我想这就是我完成这项工作所需要的全部:

use lib "../modules";

如果我的想法有误,请告诉我。

父模块

package BaseModule;
use strict;
use warnings;
sub new {
    my $class = shift;
    my $self  = {
        ARRAY => shift,
        DIVIDER => ","
    };
    bless ($self, $class);
    return $self;
}
sub array {
    my $self = shift;
    if(@_) { $self->{ARRAY} = shift };
    return $self->{ARRAY};  
}
sub divider {
    my $self = shift;
    if(@_) { $self->{DIVIDER} = shift };
    return $self->{DIVIDER};    
}
sub testSub {
    my $self = shift;   
    print join($self->{DIVIDER}, @{ $self->{ARRAY} } );
    return 1;
}

1;

子模块

package Module;
use strict;
use warnings;
#use base qw(BaseModule);
#require BaseModule;
#our @ISA = qw(BaseModule);
use parent qw(BaseModule);
sub new {
    my $class = shift;
    my $self  = $class->SUPER::New(@_);
    $self->{STRING} = shift;
    bless ($self, $class);
    return $self;
}
sub string {
    my $self = shift;
    if(@_) { $self->{STRING} = shift };
    return $self->{STRING}; 
}
sub testSub {
    my $self = shift;
    print "$self->{STRING}:\n";
    $self->SUPER::testSub();
    return 1;
}    
1;

如果父类返回一个已经祝福的$self,我需要祝福子类吗?

主脚本

#!/usr/bin/perl
use strict;
use warnings;
use Module;

my $module = Module->new([1, 2, 3, 4, 5], "Example");
$module->divider(" | "); # Test Changing divider;
$module->testSub();

非常感谢任何帮助。

【问题讨论】:

  • 我不确定@el.pescado 是什么意思

标签: perl super


【解决方案1】:
"Can't locate object method "New" via package "Module::SUPER" at Module.pm line 10"

您尝试调用 BaseModule::New,但尚未定义(您的意思是 BaseModule::new?Perl 区分大小写)。

如果父类返回一个,我需要祝福子类吗? 已经祝福了$self?

不,$self 那时已经是祝福(你可以通过Scalar::Util::blessed() 来检查。

【讨论】:

  • 哇。我完全忽略了这一点。这个案子是我的问题。新与新。现在可以了。非常感谢!
猜你喜欢
  • 2014-08-05
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多