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)