Perl でオブジェクト指向 C++風
■ |
失敗例
|
#!/usr/bin/perl use strict; use warnings; use utf8; use Math::Trig; # for pi use Storable qw(dclone); our $DEBUG = 0; { package Simple; our $template = {}; sub new { my $class = shift; my $obj = dclone($template); bless $obj, $class; return $obj; } } { package A; use base qw(Simple); our $template = {data => 0.0}; sub method_1 { my $self = shift; my ($arg1) = @_; $self->{data} = $self->{data} + pi / $arg1; return $self->{data}; } } { package B; use base qw(Simple); our $template = {data => 1.0}; sub method_1 { my $self = shift; my ($arg1) = @_; $self->{data} = $self->{data} + pi / $arg1; return $self->{data}; } } MAIN: { my $a = A->new(); my $b = B->new(); print $a->method_1(7.0) . "\n"; print $b->method_1(7.0) . "\n"; }
$ perl example_oo_0.pl Bareword "pi" not allowed while "strict subs" in use at /cygdrive/c/home/tahi/doc/blog/archive/example_oo_0.pl line 35. BEGIN not safe after errors--compilation aborted at /cygdrive/c/home/tahi/doc/blog/archive/example_oo_0.pl line 42.
#!/usr/bin/perl use strict; use warnings; use utf8; BEGIN { my @mypackage = qw( Main Main::_Simple Main::_A Main::_B ); foreach my $p (@mypackage) { eval <<"EOM"; # eval the string til "End Of Macro". { package $p; use Math::Trig; # for pi use Storable qw(dclone); } EOM die $@ if $@; # check error of eval. } } package Main; our $DEBUG = 0; { package 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::_A; use base qw(Main::_Simple); __PACKAGE__->extend_template ( ## 以下に基礎となる structure を書く。 data => 0.0, # ここに data の説明を書こう! data2 => 2.0, # ここに data2 の説明を書こう! ); sub method_1 { my $self = shift; my ($arg1) = @_; $self->{data} = $self->{data} + pi / $arg1; return $self->{data}; } } { 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; return $self->{data}; } } ## 下の MAIN: はラベルで、特に必要はない。私のクセ。 MAIN: { my $a = Main::_A->new(); my $b = Main::_B->new(); print $a->method_1(7.0) . "\n"; print $b->method_1(7.0) . "\n"; }
$ perl example_oo.pl 0.448798950512828 1.44879895051283
■ |
関連
|
更新: | 2010-12-31--2011-01-01 |
初公開: | 2010年12月31日 09:42:55 |
最新版: | 2011年01月07日 14:22:34 |
2010-12-31 09:42:55 (JST) in Perl | 固定リンク | コメント (8) | トラックバック (4)
トラックバック
他サイトなどからこの記事に自薦された関連記事(トラックバック)の一覧です。
» JRF のソフトウェア Tips:Perl でオブジェクト指向 C++風 (この記事)
先の記事で「パッケージ」でインポートした関数などを、「クラス」で使う方法を書いた。本稿では同方法で、「クラス変数」をどのように実現するか例示する。 続きを読む
受信: 2011-01-06 13:14:05 (JST)
先の記事で「パッケージ」でインポートした関数などを、「クラス」で使う方法を書いたが、インポートした関数の他に、Main パッケージで定義した「ローカル関数」も「クラス」で使いたくなるのが当然である。(というより、それができないことにさっき気付いた。)本稿ではほぼソースだけだがその方法を示す。... 続きを読む
受信: 2011-01-07 22:42:17 (JST)
抽象化された確率モデルにおいて、内的作用(内作用)により作られたモデルと外的作用(外作用)から作られたモデルが同じ臨界をもたらすことがある。経済に関するモデルを作るとき、ミクロな部分でなしたことがマクロに影響するということがいいたいことがあるが、マクロの大きな数と複雑な動きを表すにはコンピュータを用いても限界がある。確率モデルのようなアイデアをもってすれば、コンピュータシミュレーションなどで解析で... 続きを読む
受信: 2011-01-09 00:33:37 (JST)
このシリーズの最初の記事からもう3年は経過した。先日、 jrf_semaphore.pl (紹介記事へのリンク)を公開し、そこで、デバッグに便利なテクニックを構築したので、今回はその紹介をする。 このシリーズの方法では、メンバ変数へのアクセスは直接、オブジェクト本体であるハッシュ(のリファレンス)をいじって行う。そのため、メンバ名のミススペルがあると、参照時は undefined なので警告がある... 続きを読む
受信: 2014-03-17 18:20:56 (JST)
コメント
投稿: JRF | 2010-12-31 10:59:07 (JST)
投稿: JRF | 2011-01-01 17:07:11 (JST)
投稿: JRF | 2011-01-05 17:47:10 (JST)
投稿: JRF | 2011-01-06 13:43:36 (JST)
投稿: JRF | 2011-01-07 14:34:29 (JST)
「パッケージ」で「クラス」を使うのが便利な方は、「ローカル関数」を「クラス」で使うことも必要にちがいないから「その3」を読むことを強くお勧めする。
投稿: JRF | 2011-01-07 22:50:52 (JST)
投稿: JRF | 2011-01-14 18:49:52 (JST)
投稿: JRF | 2014-03-17 18:37:01 (JST)