クラスのオープン性
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.
できました。
なんだ、いくらでもどこでもサブルーチンを任意のクラスに対して追加できるのだな。
スパゲッティを気にしなければ。