gpt4 book ai didi

perl - 在创建新的 Perl 模块时,为什么不简单地使用 __PACKAGE__ 呢?

转载 作者:行者123 更新时间:2023-12-03 17:44:35 25 4
gpt4 key购买 nike

我希望我知道告诉我这是在 Perl 中创建新对象的最佳方法的引用或文档:

sub new {
my $package = shift;
my $class = ref($package) || $package
这就是我多年来创建对象的方式,但现在我想知道为什么要麻烦?除了一些边缘情况,为什么不简单地执行以下操作:
sub new {
shift; # get rid of the object or package name
my $class = __PACKAGE__;
当没有特殊原因尝试检测正在调用"new"方法的命名空间时,简单地使用 __PACKAGE__ 是否有任何问题?

最佳答案

遗产

# classA.pm 
package ClassA;
sub new { $pkg = ref($_[0]) || $_[0] ; bless { foo => 42 }, $pkg }

# classB.pm
package ClassB;
use parent 'ClassA';
sub foo { ... }

# main.pl
use ClassA;
use ClassB;
$B = ClassB->new();
print $B->foo();

在本例中, ClassBClassA 继承方法,包括它的构造函数。但是我们仍然想识别该对象属于 ClassB。 , 所以 ClassA 中的构造函数必须尊重传递给其构造函数的引用的名称。

比这更简单、更安全
$B = bless { ClassA->new(), "ClassB" };   # or
$B = bless { ClassB->new(), "ClassA" };

或在 ClassB 中添加传递构造函数.
package ClassB;
use parent 'ClassA';
sub new { bless { ClassA::new(@_), __PACAKGE__ } }

关于perl - 在创建新的 Perl 模块时,为什么不简单地使用 __PACKAGE__ 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60012964/

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