Perl:如何在没有警告的情况下调用END {}内的对象方法?

wuw*_*uwu 3 perl perl-module

package JustTesting;
use strict;
use warnings;

sub new {
    my $self = {};
    bless($self, shift);
    END { $self->goodbye() };
    return $self;
}

sub goodbye {
    print "Goodbye.\n";
}

package main;
my $this = JustTesting->new();
Run Code Online (Sandbox Code Playgroud)

输出:

变量"$ self"不会在./test第10行保持共享.
再见.

显然它可以工作,我可以no warnings在END块内抑制警告.但我想知道是否有更好的方法来做到这一点.

我尝试使用这样的匿名子:

my $cleanup = sub { $self->goodbye() };
END { $cleanup->() };
Run Code Online (Sandbox Code Playgroud)

然后像这样:

END { sub { $self->goodbye() }->() };
Run Code Online (Sandbox Code Playgroud)

但我总是得到同样的警告.

dax*_*xim 22

你很可能想要DESTROY而不是END.另请参阅perltoot中的析构函数部分.

package JustTesting;
use strict;
use warnings;

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

sub goodbye {
    print "Goodbye.\n";
}

sub DESTROY {
    my ($self) = @_;
    $self->goodbye()
};


package main;
{
    say "entering scope";
    my $this = JustTesting->new();
    say "leaving scope";
}
say "left scope";
Run Code Online (Sandbox Code Playgroud)

输出:

entering scope
leaving scope
Goodbye.
left scope

  • 是的,这就是我在寻找的东西.谢谢!现在我应该去买一本关于面向对象设计方法的书,并在接下来的六个月左右用我的额头敲打它. (2认同)

dra*_*tun 7

仅供参考未来读者,我附上了daxim正确答案Moose版本.

use 5.012;
use warnings;

{
    package JustTesting;
    use Moose;
    use namespace::clean -except => 'meta';

    sub goodbye { say "Goodbye." }

    sub DEMOLISH {
        my ($self) = @_;
        $self->goodbye;
    }
}

{
    say "entering scope";
    my $this = JustTesting->new();
    say "leaving scope"; 
}

say "left scope";
Run Code Online (Sandbox Code Playgroud)

请注意析构函数DEMOLISH子例程的使用.

NB.你会发现DESTROY仍然有效,但是DEMOLISH是正确的Moosey方式.

/ I3az /