Perl:どのように私はオブジェクトのメソッド内のEND{}警告?
-
19-09-2019 - |
質問
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();
出力:
変数は自己"のままになりたいという強い思いを共有します。/実験線10.
Goodbye.
そうでんを抑えることができ、警報 no
warnings
内側のブロックです。そして、もうひとつの場合があり
どうもよろしくお願いします。
を使ってみました匿名の字のようになります:
my $cleanup = sub { $self->goodbye() };
END { $cleanup->() };
そのようになります:
END { sub { $self->goodbye() }->() };
でも常に同じ警告が表示されます。
解決
あなたは、最も可能性の高い 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";
出力:
entering scope leaving scope Goodbye. left scope
他のヒント
ただ、将来の読者への参照のために私は<のhref = "HTTPSの Moose
のバージョンを添付しました: //stackoverflow.com/users/46395/daxim">daximするの正しい<のhref = "https://stackoverflow.com/questions/1914730/perl-how-can-i-call-object-メソッド・インサイド・エンドなしの警告/ 1914817#1914817" >答えでます。
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";
ためDEMOLISH
サブルーチンの使用に注意してくださいデストラクタする。
NB。あなたはそれはまだ動作しますが、DEMOLISHがそれを行うための正しいMooseyの方法ですがDESTROYあります。
/ I3az /
まず、参照<のhref = "http://www.perl.com/pub/a/2002/05/07/mod_perl.html#my%28%29%20scoped%20variable%20in%20nested%20subroutines "REL =" nofollowをnoreferrer ">でmy()
スコープ付き変数を説明するためのネストされたサブルーチンの
第二に、私はあなたが DESTROY
に使用する必要がありますどちらかだと思うか、ヘルパークラスに応じて何を達成しようとしている。
それは、それのように見えないEND
ブロックは、通常の(名前の)サブの宣言と同等であるのperlし、別のサブの内部で宣言という名前のサブの行動にもかかわらずので警告理由はあなたが望むものではない - 非常に最初のインスタンス - $self
ブロック内END
は$self
が呼び出され、そしてそれは、同じ値を参照し続けることsub new
の最初のの時にnew
にバインドされます作成 - あなたのプログラムの人生の残りのために。最初のインスタンスがEND
ブロックに保持された基準を有し、プログラムが終了するまで破棄されず、それ以降のインスタンスがそのEND
ブロックが全くそれらに呼び出されていません。
は、名前のサブルーチンとは異なり、無名サブルーチンは、この問題を持っていないので、彼らはオーバー閉じ任意の変数はできるだけ遅くバインドされている、とあなたが実際に必要な値が取得されますます。
他の人がすでにあなたの代わりにDESTROY
されたいか、私はあなたがが実際にのあなたが書いたコードで何が起こっているのか知りたいと思ったことを言ったとき、これはかなり長い説明です。
END
ブロックが呼び出された時点で、$のクリーンアップがすでに割り当て解除されました。変数を持つすべての作業を行うには、代わりにデストラクタを使用する必要があります。