p_chinのおっぱいブログ

UnityとPerlなど

perlのクラスメソッドとオブジェクトメソッドの違い

なんか、今更感あるけど認識が甘かったので先輩に教えてもらった。

確認の為に、以下にまとめてみた。

 


 

#!/usr/bin/env perl
use 5.016;
use warnings;
use utf8;
use autodie;

package Oppai {
    # コンストラクタ newじゃなくても良いけど慣例的にnew
    # コンストラクタはPerlではクラスメソッドの一種
    sub new {
        my ($class, %opt) = @_;
        my $self = {
            name => $opt{name},
            size  => $opt{size},
        };

        #第一引数のhashリファレンスに、第二引数のクラス名を紐づけてクラスオブジェクトにして返してる
        #class名は'Oppai'と書いても良いが、継承された時もクラス名がOppaiになってしまって問題があるので使わない
        bless $self, $class;
        $self;
    }

    # オブジェクトメソッド
    sub name {
        my $self = shift;
        $self->{name};
    }

    # クラスメソッド
    sub class_name {
        my $class = shift;
        $class .' class';
    }

};

package Bigtits { # 巨乳
    #-norequireは同じファイル内にパッケージ宣言されている場合に使う
    use parent -norequire, 'Oppai';

    sub shake {
        my $self = shift;
        #クラスメソッドとして呼び出すと死ぬようにしてる
        unless (ref $self) {
            die 'Bigtits#shake is object method!';
        }

        say 'purunpurun!';
    }
};


my $oppai = Oppai->new(name => 'p_chin', size => 60);

say $oppai->name;      # オブジェクトメソッド 出力:p_chin
say Oppai->class_name; # classメソッド 出力:Oppai
say $oppai->class_name;


my $bigtits = Bigtits->new(name => 'shinozaki_ai', size => 95);
say $bigtits->name; #出力:shinozaki_ai
$bigtits->shake;
say Bigtits->class_name; #出力:Bigtits

# Bigtits->shake; # 死ぬ

1;

結果

p_chin
Oppai class
Oppai=HASH(0x7fa9c30266b0) class
shinozaki_ai
purunpurun!
Bigtits class

まとめ

篠崎愛さんのスリーサイズがググっても見つけられなかった...