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
まとめ
篠崎愛さんのスリーサイズがググっても見つけられなかった...