読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

クラスのオープン性

Ruby勉強中。その中でRubyにはクラスのオープン性、またはRubyのクラスはオープンクラス、という記述を見つける。

class Animal; end
class Yahoo < Animal; end
class Yahoo; end          # 再オープン
p Yahoo.superclass        #=> Animal

このように既存のクラスに対して再びclass定義式を記述すれば、クラス定義を変更できます。
「初めてのRuby」(P.148)

Perlでもできるかとやってみた。

package Animal;
package Yahoo;
our @ISA = ('Animal');
package Yahoo;
print "@ISA\n"; #=> Animal

できました。


と、いうことは、useで読み込んできたクラスも勝手に自前メソッド追加できるということかな?

Hoge.pm

package Hoge;
use strict;
use warnings;
sub hoge {
  print "hoge.\n";
}
1;

Fuga.pm

package Fuga;
use strict;
use warnings;
use Hoge;

package Hoge;       # 再オープン
sub hogehoge {
  print "hogehoge.\n";
}

package Fuga;       # 再び Fuga
sub fuga {
  Hoge::hoge();      # Hoge.pmで定義
  Hoge::hogehoge();  # Fuga.pmで定義
}
1;
use strict;
use warnings;
use Fuga;
Fuga::fuga();   #=> hoge.
                #=> hogehoge.

できました。
なんだ、いくらでもどこでもサブルーチンを任意のクラスに対して追加できるのだな。
スパゲッティを気にしなければ。