あるソフトウェアエンジニアの戯言

日々の開発やサーバ管理のなかで出てきたあれや、これや、あんなことや、こんなこと

この記事のキーワード:   Moose   perl

Moose::Cookbook::Basics::Recipe3
- ちょっといい加減な二分木の例

概要

         package BinaryTree;
         use Moose;

         has 'node' => (is => 'rw', isa => 'Any');

         has 'parent' => (
             is        => 'rw',
             isa       => 'BinaryTree',
             predicate => 'has_parent',
             weak_ref  => 1,
         );

         has 'left' => (
             is        => 'rw',
             isa       => 'BinaryTree',
             predicate => 'has_left',
             lazy      => 1,
             default   => sub { BinaryTree->new(parent => $_[0]) },
         );

         has 'right' => (
             is        => 'rw',
             isa       => 'BinaryTree',
             predicate => 'has_right',
             lazy      => 1,
             default   => sub { BinaryTree->new(parent => $_[0]) },
         );

         before 'right', 'left' => sub {
             my ($self, $tree) = @_;
             $tree->parent($self) if defined $tree;
         };

例によって、ここまで


とりあえず、サンプルプログラムを読んだだけで、いままでのレシピにはなかった、いくつかのことがわかる。
列挙してみる

  • attributeの 'Any'型指定
  • has の predicate オプションの存在
  • has の weak_ref オプションの存在
  • has の lazy オプションの存在
  • has の default オプションへ 関数リファレンスを渡すということ
  • before の引数として、複数のメソッド名を渡すことが可能だということ

で、説明を読むに、それぞれ、以下のようなことらしい。

attribute の 'Any'型指定
どんな値でもいい。ようするに型の指定なし、ということ。isaオプションが未指定の場合と全く同じ。
has の predicate オプション
そのattributeが存在するかどうかをチェックするメソッドをオプションに指定した名前のメソッドとして生成してくれる
has の weak_ref オプション
そのattributeが weakend referenceだという指定。 weakened reference については「プログラミングperl」なりその他のドキュメントを当るべし。
has の default オプションに関数リファレンスを渡す
defaultに渡す値が文字列または数値以外の(初期値を指すリファレンスになるような)場合は、リファレンスをそのままdefaultに設定してしまうと、すべてのインスタンスで実体が同じものを指してしまって具合が悪いので、関数リファレンス中で生成した個別の実体を指すようにしなくてはいけない。そのために、関数リファレンスをdefaultの値として渡す、ということですね。これで、初期値を得るために、この関数が実行されて、戻り値を初期値として設定する、という動作になる。これは、attributeの型がオブジェクトではなくて、array や hash の場合でも同様。(新しく生成した配列やハッシュのリファレンスを返す関数を渡す)
has の lazy オプション
まず、defaultオプションがないときにはlazyオプションの指定はできない(するとクラス生成時(*)にエラーになる)。このオプションが指定されると、attributeの生成は可能な限り遅らされる。最初に値を格納しようとしたときは、初期値の生成は実行されずに、指定した値を格納する。逆に、値を読み出そうとしたときは、その時点で初期値を生成して、値を返す。
before の引数として、複数のメソッド名を渡せる
これは見たまま。おそらく、最後の引数をそれ以前の引数で指定されるメソッドに適用する、という実装になっているのだと思われる。ちなみに、このbeforeで設定される関数でツリーの枝に接続するノードのparentノードを自分自身に設定するようになっている。
[トラックバック] トラックバックPingURL : http://blog.d-pad.co.jp/sugi/dblog/ping.fcgi/32
言及リンクのないページからのトラックバックは拒否される仕様になっておりますのでご注意ください。
名前:
メールアドレス(任意):
参考URL(任意):

キーワードリスト

バックナンバー