Yappo::タワシ このページをアンテナに追加 RSSフィード

2011-10-19

Perl で誤って無限ループに陥るコード

Perl は非常にシンプル言語であるが、恐らく初心者が、誤って無限ループに陥ると思われる箇所がいくつかある。

オブジェクトコンストラクター

package X {
    sub new { new X() } # 無限ループ                                                                                                  
}
package main {
    my $x = new X();
}

このコードは、無限ループに陥る。なぜならば、new X()というのは、オブジェクトコンストラクターXを呼び出す式である。これは、つまり自分自身を再帰呼び出ししていることになる。結果として、無限ループになる。

クラスゲッターセッター

クラスゲッターセッターは、クラス変数への簡単な読み書きを提供するための特殊なメソッドである。これは、明示的に生成する。

サブクラスでは、この暗黙のゲッターセッターをオーバーライドすることができる。つまりゲッターセッターで、なにか複雑な処理を行うこともできるのだ。

package X {
    sub val {}
}
package Y {
    use parent 'X';
    sub val { my $self = shift; $self->val; } # 無限ループ                                                                            
}

これは無限ループとなる。なぜか。考えてみて欲しい、クラスYのスコープにおけるvalとは何なのか。それは、もちろんYのスコープで宣言されているvalである。つまり、Yのゲッター関数valということになる。これは、自分自身の再帰呼び出しである。つまり無限ループになる。

参考文献: http://cpplover.blogspot.com/2011/10/dart_19.html

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/yappo/20111019/1318983892