gpt4 book ai didi

perl - Perl 子类是否继承导入的模块和编译指示?

转载 作者:行者123 更新时间:2023-12-04 03:09:56 25 4
gpt4 key购买 nike

假设您在一个文件中有一个父 Perl 类:

#!/usr/bin/perl
package Foo;
use strict;
use warnings;

use Data::Dumper;

sub new{
my $class = shift;
my %self = ();
return bless %self, $class;
}
1;

和不同文件中的子类:
#!/usr/bin/perl
package Bar;
use base "Foo";
1;

子类会继承父类的 use 语句吗?我知道方法 new 将被继承。

基本上我试图减少代码中的样板数量,但我找不到这个问题的明确答案。

最佳答案

您在评论中询问了 Test::Most 以及它如何减少样板。查看它的 import 方法。它将模块加载到其命名空间中,将这些符号添加到 @EXPORT ,然后通过 import 重新调用另一个 goto 以最终将它们放入调用命名空间。这是柯蒂斯在那里使用的一些严重的黑魔法,虽然我想知道他为什么不使用像 import_to_level 这样的东西。也许有一些我没有考虑的副作用。

我在 Avoid accidently creating methods from module exports in The Effective Perler 中谈论了很多这类事情。这是在不同的背景下,但它是一些相同的问题。

这是一个不同的例子。

如果某个其他模块加载了一个模块,您就可以访问它。但是,依赖它并不好。这是三个单独的文件:

Top.pm

use 5.010;

package Top;
use File::Spec;

sub announce { say "Hello from top!" }
1;

底部.pm
package Bottom;
use parent qw(Top);

sub catfiles { File::Spec->catfile( @_ ) }

1;

test.pl
use 5.010;

use Bottom;

say Bottom->catfiles( qw(foo bar baz) );

say File::Spec->catfile( qw( one two three ) );

我只在 Top.pm 中加载 File::Spec。但是,一旦加载,我就可以在 Perl 程序的任何地方使用它。输出显示我能够在其他文件中“使用”该模块,即使我只将它加载到一个文件中:
Bottom/foo/bar/baz
one/two/three

为此,加载模块的代码部分必须在代码的任何其他部分尝试使用该模块之前加载。正如我所说,依赖这个是一个坏主意:如果加载顺序发生变化或加载模块消失,事情就会中断。

但是,如果要导入符号,则必须在要导入的包中时显式加载所需的模块。就是这样,导出模块定义了该包中的符号。这不取决于范围。

关于perl - Perl 子类是否继承导入的模块和编译指示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3460456/

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