Perl でオブジェクト指向 C++風 その3 ローカル関数
先の記事で「パッケージ」でインポートした関数などを、「クラス」で使う方法を書いたが、インポートした関数の他に、Main パッケージで定義した「ローカル関数」も「クラス」で使いたくなるのが当然である。(というより、それができないことにさっき気付いた。)本稿ではほぼソースだけだがその方法を示す。
#!/usr/bin/perl
use strict;
use warnings;
use utf8; # Japanese
BEGIN {
my @mypackage = qw(
Main
Main::_Simple
Main::_B
);
foreach my $p (@mypackage) {
eval <<"EOM";
{
package $p;
use Math::Trig; # for pi
use Storable qw(dclone);
}
EOM
die $@ if $@;
}
my @myfunction = qw(
Main::local_function_1
);
{
no strict; ## 型グロブの警告を停止。
foreach my $p (@mypackage) {
for my $f (@myfunction) {
my @f = split("::", $f);
*{$p . "::" . $f[$#f]} = \&{$f};
}
}
}
}
package Main;
{
package Main::_Simple;
## Main::_Simple の定義はこれまでどおり。
my %template = ("Main::_Simple" => {});
sub extend_template {
my $class = shift;
my @hash = @_;
if (exists $template{$class}) {
$template{$class} = {%{$template{$class}}, @hash} if @hash;
} else {
$template{$class} =
{(map {
$_->extend_template() if ! exists $template{$_};
%{$template{$_}};
} (eval '@{' . $class . '::ISA}')),
@hash
};
}
return $template{$class};
}
sub get_template {
my $class = shift;
return $class->extend_template();
}
sub new {
my $class = shift;
my $obj = dclone($class->get_template());
bless $obj, $class;
return $obj;
}
}
{
package Main::_B;
use base qw(Main::_Simple);
__PACKAGE__->extend_template
(
data => 1.0, # ここに data の説明を書こう!
);
sub method_1 {
my $self = shift;
my ($arg1) = @_;
$self->{data} = $self->{data} + pi / $arg1;
## ここで「ローカル関数」を使う。
local_function_1();
return $self->{data};
}
}
## ただ print するだけの「ローカル関数」。
sub local_function_1 {
print "OK\n";
}
MAIN:
{
## Main::_B::method_1 から local_function がちゃんと呼ばれる。
my $b = Main::_B->new();
print $b->method_1(7.0) . "\n";
}
つまり、「プロトタイプ宣言」のようなものが必要でいいという発想である。ソースの「頭」が重い感じがするが、慣れの問題だろうと思いたい。
「ローカル関数」のモジュール名を Main と想定してあるので、変更する際はそのあたりに注意する必要がある。
| ■ |
関連
|
| 更新: | 2011-01-07 |
| 初公開: | 2011年01月07日 22:40:11 |
| 最新版: | 2011年01月14日 18:42:25 |
2011-01-07 22:40:08 (JST) in Perl | 固定リンク | コメント (1) | トラックバック (0)
トラックバック
他サイトなどからこの記事に自薦された関連記事(トラックバック)はまだありません。
» JRF のソフトウェア Tips:Perl でオブジェクト指向 C++風 その3 ローカル関数 (この記事)
コメント
投稿: JRF | 2011-01-14 18:48:10 (JST)