PerlにはOOP機能がありますが、あまり使用されることはほとんどありません。メソッドとプロパティでPerlオブジェクトを作成して使用するにはどうすればよいですか?ここでどのようにしてPerlでオブジェクトを作成しますか?
答えて
あなたは間違いなくMoose
を見てください。
package Point;
use Moose; # automatically turns on strict and warnings
has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');
sub clear {
my $self = shift;
$self->x(0);
$self->y(0);
}
Mooseは、コンストラクタ、アクセサメソッド、型チェックを無料で提供します。
そうすることができますあなたのコード内:
my $p = Point->new({x=>10 , y=>20}); # Free constructor
$p->x(15); # Free setter
print $p->x(); # Free getter
$p->clear();
$p->x(15.5); # FAILS! Free type check.
良い出発点はMoose::Manual
と
あなただけのように完全ではありませんあなたもMouse
を使用することができます基本的なものが必要な場合はMoose::Cookbook
が、なしですコンパイル時のペナルティのほとんど。
は、ガイドです:http://www.tutorialspoint.com/perl/perl_oo_perl.htm
編集:良い点、私はコピーしたコードを削除しています。
CPAN siteの公式チュートリアルは良いです。
CodeProjectにはCamel POOPといういい記事があります。
通常のPerlインストールがあれば、すべてのperldocチュートリアルもコマンドラインで利用できることに注意してください。perldoc perltoot for this perltoot。 (Perlのオブジェクトでもっと楽しくなるためにperldoc perlbootも参照してください) – Telemachus
現在、私はオブジェクトがほしいと思うときはいつもObject::InsideOutを使用しています。それは標準的なblessedハッシュオブジェクトよりも多くの機能を提供します。私が新しいプロジェクトを始めていたら、真剣にムースを見るだろうと言っていました。それは公式のPERLのドキュメントを読むためには良いですが
することは、私はは直接に簡単に道路や「ピーク」を取るために、そのはるかに魅力的に、ハッシュを使用したロールに独自のオブジェクト・フレームワーク、または建物オブジェクトをしようとお勧めしませんオブジェクトの "private"変数はカプセル化を完全に破っていますが、これはオブジェクトをリファクタリングするときにあなたを噛んでいます。
Perlオブジェクトは、幸福なハッシュではありません。彼らは祝福された参照です。それらは、祝福されたハッシュリファレンスになることができます(そして、たいていの場合)。しかし、スカラーまたは配列参照と同じように簡単に祝福することができます。
Mooseです。
package Person;
use Moose;
has age => (isa => Int, is => 'rw');
has name => (isa => Str, is => 'rw');
1;
直ちに、 'has'で定義した属性のnew()メソッドとアクセサメソッドが無料になります。だから、あなたは言うことができる:
my $person = Person->new();
$person->age(34);
$person->name('Mike');
print $person->name, "\n";
など。それだけでなく、アクセサメソッドも無料でタイプチェックされます(また、独自の型も標準の型も定義できます)。さらに、サブクラス化のために '拡張'、役割/特性については 'と'、そして強固なメンテナンス可能なOOコードを書くという本当の仕事で乗り越えることができる他のすばらしいものが得られます。
TMTOWTDIですが、これは動作します。
片足では、各クラスはパッケージです。パッケージ変数@ISA(コンパイル時に設定することをお勧めします)を設定して継承を設定します。既存のデータからオブジェクトを作成します(インスタンス変数を保存するために使用される匿名のハッシュであることがよくありますが、必ずしもそうではありません)。bless(REFERENCE [、CLASSNAME]); $ obj-> methodname(@ARGS)のようなオブジェクトメソッドと "CLASSNAME" - > methodname(@ARGS)のようなクラスメソッドを呼び出します。 mroを使用して、複数の継承メソッドの解決順序を変更できます。
これはやや単純でカプセル化を強制しないため、より多くの機能または異なる機能を提供する多くの異なるモジュールがあります。
Perlでオブジェクト指向を実行する場合は、Mooseをご覧ください。しかし、Perlのオブジェクト指向が何であるかを理解していないとあまり役に立ちません。 Perlオブジェクト指向がどのように機能するかをよりよく理解するために、私は自分のブログの概要を書いた:http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/
オブジェクトは、いくつかの特別な機能を持つリファレンスです。これらの特別な参照は、キーワード "bless"で "bless"されているため、オブジェクトとして扱われます。祝福された参照には、それらがObjectであることを示すフラグが含まれます。基本的には、メソッドを定義して呼び出すことができます。
たとえば、基本的なハッシュリファレンスを作成した場合、これはうまくいかないでしょう: $ hashref-> foo();
しかし、祝福されたハッシュリファレンス(別名オブジェクト)を作成すると、これは機能します: $ blessed_hashref-> foo();
Mooseは強制的なOOレイヤーを作成し、アクセサーメソッドを自動的に処理するため、getterとsetterの束を定義する必要がないため、PerlのOOPの優れたモジュールです。 Devel :: Peakを使ってPerlインタープリタがどのようにオブジェクトを格納しているかを知りたい場合は、上に掲示したブログエントリへのリンクをたどってください。
またはマウスMooseの単純な機能が必要な場合 –
完全に初心者向けの良いチュートリアルがありますか?ありがとうございました – melaos
@ Alexandr、ありがとうございました。 @melaos私はリンクを提供する答えを編集しました – Pat