続: インスタンス オブジェクトを消したい

インスタンス オブジェクトを消したい - よくきたはてダ でいろいろコメントをいただいたので,ご提示いただいたサンプルをなぜ使わなと考えるかを一応書いておきます.

元ネタは「インスタンス オブジェクトを今すぐ消したいんだけど!!」という話です.

っで,いただいたコメントから取り上げるのはこの辺.

hidekiy


2010/08/01 11:50
http://codepad.org/5Lnz5OSj
http://codepad.org/1FUKYJUk






hidekiy


2010/08/01 11:53
見返してみると何かプロパティとして入れておかないと有難味は分からないですね。この技は明示的に循環参照を切るときに使います。






elf


2010/08/06 09:56
結論から言うと,すみませんが今のところオブジェクトを消すためにご提示いただいた手法は個人的には公私共に利用することはないと思います#特に仕事だと何らかの権限の方から「使え」といわれるとまた別の判断もあると思いますけど

今回改めて取り上げるのはいただいたコードのひとつ,

use Data::Dumper;

package foo;
sub new { $class = shift; bless {}, $class;}
sub DESTROY { print "bye!\n"; }

package main;
$obj = new foo;
print Dumper($obj);
%$obj = ();
print Dumper($obj);

です.たぶん上鍵の推測ではこれは(上鍵の)期待通りに動いていないと思ったので,検証するために簡単に編集してみました。

#ちなみにこの「期待通り」は「こういう結果であってほしい」であって厳密にはperlの仕様どおりとしての期待通りという意味ではないです.念のため

use Data::Dumper;

package foo;
sub new { $class = shift; bless {}, $class;}
sub DESTROY { print "bye!\n"; }

package main;
$obj = new foo;
print Dumper($obj);
%$obj = ();
print Dumper($obj);

こちら差分.

--- p9a.pl      2010-08-06 02:00:12.000000000 +0900
+++ p9b.pl      2010-08-06 01:59:44.000000000 +0900
@@ -2,6 +2,7 @@
 
 package foo;
 sub new { $class = shift; bless {}, $class;}
+sub foo { print "foo\n";}
 sub DESTROY { print "bye!\n"; }
 
 package main;
@@ -9,3 +10,4 @@
 print Dumper($obj);
 %$obj = ();
 print Dumper($obj);
+$obj->foo();

ようするに"foo"を出力するメソッドfoo()を追加し,実行しただけです.っで,実行結果.

$ perl p9b.pl
$VAR1 = bless( {}, 'foo' );
$VAR1 = bless( {}, 'foo' );
foo
bye!

予想通り実行できてしまいました.ちなみに別にご提案いただいたundefだとエラーになります.

use Data::Dumper;

package foo;
sub new { $class = shift; bless {}, $class;}
sub foo { print "foo\n";}
sub DESTROY { print "bye!\n"; }

package main;
$obj = new foo;
print Dumper($obj);
undef $obj;
print Dumper($obj);
$obj->foo();

こちら期待通りです

$ perl p9c.pl
$VAR1 = bless( {}, 'foo' );
bye!
$VAR1 = undef;
Can't call method "foo" on an undefined value at p9c.pl line 13.

ということで簡単ですがこれにて.