Perl:どのように私はオブジェクトのメソッド内のEND{}警告?

StackOverflow https://stackoverflow.com/questions/1914730

  •  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() }->() };

でも常に同じ警告が表示されます。

他のヒント

ただ、将来の読者への参照のために私は<の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ブロックが呼び出された時点で、$のクリーンアップがすでに割り当て解除されました。変数を持つすべての作業を行うには、代わりにデストラクタを使用する必要があります。

はperldocはperltootするます。

で "デストラクタ" を参照してください。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top