加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 使用内联包继承常量

发布时间:2020-12-15 21:46:09 所属栏目:大数据 来源:网络整理
导读:好.我在尝试继承任何子类的父类中设置的常量时遇到问题. #!/usr/bin/perluse strict;use warnings;package Car;use Exporter qw( import );our @EXPORT_OK = ( 'WHEELS','WINGS' );use constant WHEELS = 4;use constant WINGS = 0;sub new { my ( $class,%a
好.我在尝试继承任何子类的父类中设置的常量时遇到问题.
#!/usr/bin/perl
use strict;
use warnings;

package Car;
use Exporter qw( import );
our @EXPORT_OK = ( 'WHEELS','WINGS' );

use constant WHEELS => 4;
use constant WINGS  => 0;

sub new {
    my ( $class,%args ) = @_;
    my $self = {
        doors  => $args{doors},colour => $args{colour},wheels => WHEELS,wings  => WINGS,};
    bless $self,$class;
    return $self;
}

package Car::Sports;
use base qw( Car );

sub new {
    my ( $class,engine => $args{engine},$class;
    return $self;
}

package main;
my $obj = Car->new( doors => 4,colour => "red" );
print Dumper $obj;

my $obj2 = Car::Sports->new( doors => 5,engine => "V8" );

print Dumper $obj2;
__END__

错误是:

Bareword "WHEELS" not allowed while "strict subs" in use at ./t.pl line 30.
Bareword "WINGS" not allowed while "strict subs" in use at ./t.pl line 30.
Execution of ./t.pl aborted due to compilation errors.

现在,我没有做过一些研究而没有来这里发帖.我知道一个选择是在Car :: Sports中使用Car qw(WHEELS WINGS).但是,如果我这样做,我会收到以下错误,因为这些类都在同一个文件中内联:

Can't locate Car.pm in @INC

出于各种原因,我需要将我的包保存在一个文件中.有没有解决的办法?由于常量基本上只是subs,为什么我必须导入它们,而对于普通方法则不一样?

最后,我也知道我可以这样做:

package Car::Sports;
use base qw( Car );

sub new {
    my ( $class,wheels => Car::WHEELS,wings  => Car::WINGS,$class;
    return $self;
}

它很好……但我有许多类,并希望使常量的继承更通用,必须明确地命名父类(有时它不仅仅是父类,而是祖父母).

非常感谢任何指针!

干杯

解决方法

一种解决方法是包括该行
package Car::Sports;
use base qw( Car );
Car->import(qw(WHEELS WINGS));

并使用Car :: Sports构造函数中的sigils:

...
wheels => &WHEELS,wings  => &WINGS,...

您的Car类在运行时之前未定义其@EXPORTS_OK列表.这些符号是必需的,因为Car :: Sports构造函数在编译时被解析,编译器不知道Car :: Sports命名空间中应该有WHEELS和WINGS符号.

避免这些印记的唯一方法是在编译时定义Car的导出:

package Car;
our @EXPORT_OK;
BEGIN {@EXPORT_OK = qw(WHEELS WINGS)} # set at compile not run time
...

package Car::Sports;
use base qw(Car);
BEGIN {Car->import('WHEELS','WINGS')} # import before c'tor is parsed

您还可以通过在其自己的Car.pm文件中定义Car类来避免这些阴谋.然后你会说

use Car qw(WHEELS WINGS);

并且Car.pm文件中的所有内容都将在编译时进行解析,并且Exporter :: import方法(通过调用Car :: import触发)将自动运行并将所需的符号导入当前的命名空间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读