gpt4 book ai didi

perl - 为什么我不应该在 UNIVERSAL 包中创建 AUTOLOAD 子例程?

转载 作者:行者123 更新时间:2023-12-02 13:40:58 25 4
gpt4 key购买 nike

我的直觉告诉我这是一个非常糟糕的主意,但我无法确定它的具体问题。接下来是使用 UNIVERSAL 包中的 AUTOLOAD 子例程的 mixin/traits 的非常原始的实现。就XY problem而言答案,正确答案是使用Moo ,但与我交谈的人不想出于某种毫无意义的原因使用非核心模块,我想说服他们,这种方法虽然在技术上是可行的,但却是一个坏主意,所以我需要技术原因来解释为什么这种方法是除了令人恶心的感觉之外,这是一个坏主意。

#!/usr/bin/env perl

use strict;
use warnings;
use 5.010;

{
package UNIVERSAL;

sub with {
my ($class, @mixins) = @_;

our %mixin_map;

push @{ $mixin_map{$class} }, @mixins;
}

sub AUTOLOAD {
our $AUTOLOAD;

# Never propagate DESTROY methods
return if ($AUTOLOAD =~ /::DESTROY$/);

my ($class, $method) = $AUTOLOAD =~ /(.*)::(.*)/;

my @mixins = do {
our %mixin_map;
@{ $mixin_map{$class} };
};
for my $mixin (@mixins) {
# find the mixin/trait that supports this method
if (my $sub = $mixin->can($method)) {
{ #install the mixin's method in the class
no strict "refs";
*{ "$class::$method" } = $sub;
}
# call this class's method with the original arguments
return $class->can($method)->(@_);
}
}

use Carp;

Carp::croak("could not find a method $method for class $class\nlooked in:", join ", ", @mixins);

}
}

{
package T;


T->with(qw( Init Misc ));
}

{
package A;

A->with( qw/Init Helper/ );
}

{
package Init;

sub new {
my ($class, $hParams) = @_;

return bless {}, $class;
}
}

{
package Helper;

sub foo {
my ($self) = @_;
print "foo here\n";
}
}

{
package Misc;

sub something {
my ($self) = @_;
print "and more...\n";
}
}

{
package main;

my $t = T->new;

my $a = A->new;

$a->foo;
$t->something;

eval {
$t->foo;
1;
} or do {
print "yay! calling foo on t failed\n";
};

eval {
$a->something;
1;
} or do {
print "yay! calling somehting on a failed\n";
};
}

最佳答案

问题:

  • 当您安装 AUTOLOAD 时,您应该创建相应的 can
  • 破坏任何现有的UNIVERSAL::AUTOLOAD
  • 向所有类添加 with
  • 被大多数其他AUTOLOAD破坏。

有些是可以修复的,有些则不能。但这表明这是多么复杂和脆弱。这是完全没有必要的。 with 可以导入方法,也可以简单地将类添加到 @ISA

关于perl - 为什么我不应该在 UNIVERSAL 包中创建 AUTOLOAD 子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28729542/

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