Perl - 无法通过 "Module::SUPER" 找到 object 方法
Perl - Can't locate object method via "Module::SUPER"
这是我第一次将 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";
如果我的想法有误,请告诉我。
Parent 模块
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;
Child 模块
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;
如果 parent class returns 已经祝福了 $self,我还需要祝福 child class 吗?
主脚本
#!/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();
非常感谢任何帮助。
"Can't locate object method "New" via package "Module::SUPER" at Module.pm line 10"
您尝试调用 BaseModule::New
尚未定义(您是说 BaseModule::new
吗?Perl 区分大小写)。
Do I need to bless the child class if the parent class returns an
already blessed $self?
不,$self
到那个时候已经是祝福了(你可以通过 Scalar::Util::blessed()
.
来检查
这是我第一次将 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";
如果我的想法有误,请告诉我。
Parent 模块
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;
Child 模块
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;
如果 parent class returns 已经祝福了 $self,我还需要祝福 child class 吗?
主脚本
#!/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();
非常感谢任何帮助。
"Can't locate object method "New" via package "Module::SUPER" at Module.pm line 10"
您尝试调用 BaseModule::New
尚未定义(您是说 BaseModule::new
吗?Perl 区分大小写)。
Do I need to bless the child class if the parent class returns an already blessed $self?
不,$self
到那个时候已经是祝福了(你可以通过 Scalar::Util::blessed()
.