perlのUNIVERSALクラス

パッケージ名->can( メソッド名 );

__PACKAGE__->can( $m );

ClassName->can( $m );

canメソッドはUNIVERSALクラスが提供している。

http://d.hatena.ne.jp/macperl/20070530/p1

UNIVERSALクラス。使ったことありませんでした。

今居るpackageにhoge関数が存在するかどうかを調べる。

print "hoge関数は存在する。\n" if __PACKAGE__->can("hoge");

動的に関数を呼出す場合はこの方法でチェックした方がいいですね。

UNIVERSALクラスは、全てのクラスのbaseクラスということですので、全てのクラスを拡張するということもできるようでした。

全てのクラスにdumpメソッドを定義する。

#!/usr/bin/perl
use strict;
use warnings;
{
#UNIVERSALクラスを拡張する。
no strict "refs";
*{"UNIVERSAL::dump"} = sub {
my $self = shift;
if (ref($self)) {
use Data::Dumper;
Dumper($self);
}
};
}
package Foo;
sub new {
my $class = shift;
return bless {data => 100}, $class;
}
package main;
my $foo = new Foo;
print $foo->dump;

実行結果

$VAR1 = bless( {
'data' => 100
}, 'Foo' );

まぁ、UNIVERSALクラスにメソッド追加を積極的に利用するとキモいですね。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください