【发布时间】:2026-01-16 17:00:02
【问题描述】:
我可以导出使用enum::fields 创建的常量吗?例如:
package XLine {
use enum::fields qw{VAL SLOPE INTERVAL};
use parent qw(Exporter);
our @EXPORT = qw(VAL SLOPE INTERVAL);
sub new {
my $class = shift;
my $self = bless [], $class;
return($self);
}
}
my $x = XLine->new();
printf("INTERVAL = %d\n", INTERVAL);
我应该使用不同的“常量”包吗?我用这个是因为我读到它很快,在这里:http://neilb.org/reviews/constants.html
【问题讨论】:
-
通过您引用的文档,该模块的要点之一是可以对其进行子类化。但是,显示的代码混合了类和(非类)包中的东西(你不会从类中“导出”东西,而是提供 class 数据/方法)所以我不确定我得到你需要的。
-
我理解您的评论。这正是我想要做的就是从一个类中导出一个常量。这通常不是我使用类的方式,实际上其他一切都是方法。在这种情况下,我从包中获得双重职责:一次作为类,一次作为常规包。
-
好的。因此,
VAL(等)是索引值的名称,因此可以使用$self->[VAL]而不是使用0。因此,您真的想将它们提供给外界吗……?如果您只想“导出”一些变量(在类中定义它们并使其在外部可用),我建议您使用Readonly和/或Const::Fast。 -
我明白你的意思是有一个单独的常量包。选择如何(而不是在哪里)执行常量是基于我提到的文章。
enum::fields应该比Readonly或Const::Fast更快。我还没有测试过。 -
"export a constant from a class" -- 这可以通过简单地定义一个类(全局)变量来完成,例如
const our $VAR => 5;,并且类用户可以将其用作$ClassName::VAR。 (我使用了Const::Fast。)不需要实际导出。但是,如果您确实需要由enum::fields去定义的VAL(等)的值,那么您似乎确实可能需要导出它们。