gpt4 book ai didi

perl - 使用内联包继承常量

转载 作者:行者123 更新时间:2023-12-04 17:03:50 24 4
gpt4 key购买 nike

好的。我在尝试为任何子类继承父类中设置的常量时遇到问题。

#!/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, %args ) = @_;
my $self = {
doors => $args{doors},
engine => $args{engine},
wheels => WHEELS,
wings => WINGS,
};
bless $self, $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.

现在,我没有做一些研究就来这里发帖。我知道一种选择是 use Car qw( WHEELS WINGS)Car::Sports .但是,如果我这样做,我会收到以下错误,因为这些类都内联在同一个文件中:
Can't locate Car.pm in @INC 

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

最后,我也知道我可以这样做:
package Car::Sports;
use base qw( Car );

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

这很好......但是我有很多类,并且希望使常量的继承更加通用,而不必显式命名父类(有时不仅是父类,还有祖父类)。

非常感谢您的指点!

干杯

最佳答案

一种解决方法是包含该行

package Car::Sports;use base qw( Car );Car->import(qw(WHEELS WINGS));

AND use the sigils in the Car::Sports constructor:

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

您的 Car类没有定义它的 @EXPORTS_OK列出直到运行时。因为 Car::Sports 需要这些符号构造函数在编译时被解析,编译器不知道应该有 WHEELSWINGS Car::Sports 中的符号命名空间。

避免符号的唯一方法是定义 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 来避免这些阴谋。自己的类(class) Car.pm文件。那你只会说
use Car qw(WHEELS WINGS);

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

关于perl - 使用内联包继承常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7474005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com