Translate

2013年8月17日土曜日

Perlでクラスを書く

学習のため、某JavaのソースコードをPerlで表現してみる。

class Rectangle {
    int width;
    int height;
    void setSize(int w, int h){
        width = w;
        height = h;
    }
    int getArea(){
        return width * height;
    }
}

perlだとコンストラクタは必須なのでnewは書くとして
・値はsetSizeで指定する
・getAreaにて面積を求めあたいを返す
これを表現します。
package Rectangle;
use strict;
use warnings;
use utf8;
binmode STDERR, ":utf8";

sub new{
    return bless {width=>0, height=>0}, shift;
}
                                                                                   
sub setSize{
    my $self = shift;

    if(@_!=2){die("setSizeの引数を2つ指定してください(width, height)")}
    $self->{width}  = $_[0];
    $self->{height} = $_[1];
}

sub getArea{
    my $self = shift;
    return $self->{width} * $self->{height};
}

1;
JavaやJavascriptと言った言語だと自動的にthisを参照すると自分自身のオブジェクトを参照できるけども
Perlだとshiftをすることで他の言語のthisの代わりのようなことができると。
つまり第一引数に自動的にオブジェクトがはいっているので取り出したら使えるよってことね。

ちなみに、blessのとこでJavaで言うとこのプロパティを用意しています。
使ってみます
use strict;
use warnings;
use utf8;  
use feature 'say';
binmode STDOUT, ":utf8";

use lib qw(lib);
use Rectangle;

my $r = Rectangle->new();
$r->setSize(123, 45);

say "幅 :". $r->{width};
say "高さ:". $r->{height};
say "面積:". $r->getArea();

0 件のコメント: