�Ȥ����櫓�ǡ����֡�
404 Blog Not Found:perl - ��ǽ��new�ν����������餬���򤯤ʤ�Τ�������Entry�ؾ���
���������ܤ��Ƥ�������������
sub init { my $self = shift; $self->{$_} = $default{$_} for keys %default; $self->SUPER::init(); }
������˸¤餺����ʬ�Dz����򤷤��鼡�Υ᥽�åɤ˿���Ȥ����Τϡ�OO�Ǥ����ˤ褯��������ʤ����ä�plugin�ʤɤ�ȤäƤ����硢���줬��������
�����������Υ����ɡ����Υ᥽�åɤ˿��äƤ���ΤϤ����Τ����ɡ����äƤ�����äƤ���Τ����᥽�åɸƤӽФ���ؿ��ƤӽФ��˲᤮�ʤ��Τ����顢�����Ȥ������������������ξ�硢��äƤ���ɬ�����������ʤ���
�����ޤ��ä��ơ�404 Blog Not Found:perl - to goto or not to goto, that's the continuation��פ��Ф������ʤ��ϱԤ������줳���䤬���������ä����ʤΤ����顣
�ʲ��Υ����ɤ���ĺ��������
package Klass; sub new { my $thing = shift; my $class = ref $thing || $thing; my $self = ref $thing && $thing; $self ||= []; bless $self => $class; $self->init() if $self->can('init'); return $self; } sub init { my $self = shift; push @$self, __PACKAGE__; $self; } package Klass::Sub; our @ISA = qw/Klass/; sub init { push @{$_[0]}, __PACKAGE__; my $super = $_[0]->can('SUPER::init') or return $_[0]; goto $super; } use Data::Dumper; my $ks = Klass::Sub->new(); print Dumper $ks;
���졢�¹Ԥ��Ƥߤ�Ȥ����ʤ롣
$VAR1 = bless( [ 'Klass::Sub', 'Klass' ], 'Klass::Sub' );
�ޤ��˴��Ԥɤ���ǤϤʤ�����
����������������Ǥ�goto��Ȥ���Ȥ������ȤϤ狼�äƤ⡢goto�򤢤��ƻȤ���ͳ�ޤǤ��뤫�Ϥ狼��ʤ��������ǡ�Benchmark�������ɤ�Ĺ���ΤǺǸ��ź�դ��������ޤ��Ϸ�̤򸫤Ƥ�餤������
depth = 1Rate Noself Return Goto Noself 95441/s -- -2% -16% Return 97619/s 2% -- -14% Goto 113142/s 19% 16% --depth = 99
Rate Return Noself Goto Return 1500/s -- -2% -33% Noself 1527/s 2% -- -32% Goto 2235/s 49% 46% --
������Noself�Ȥ����Τϡ�my $self = shift
���ᡢ$self
�����������$_[0]
��Ȥä���Ρ����Ƥ��̤ꡢ��������ǤϤۤȤ��®���ʤ�ʤ����ɤߤ䤹�������ˤ��Ƥޤ�$_[0]
��Ȥ��ΤǤ���С�goto
���ʤ����»�Ȥ�����ΤǤ��롣
�伫�ȡ������ޤ��ܤ˸����ư㤤���Ф�Ȥϻפ�ʤ��ä���
���ʤߤˡ��ˤʿͤ�depth�λ����100�ʾ�ˤ��Ƥߤ褦����¿�ˤ��ܤˤ�����ʤ���Τ˽��񤨤롣
Perl 5��goto�ϡ����Ȥߤ����򤷤���ǻȤ��ɤ��������ʤ���Ф��Τ��Ȥ����ϤʤΤǤ��롣
OO��goto���Ȥ߹�碌�����ºݤ���ˤ��Ĥʤ�ơ�POO����줽���Ǥ���(POO�˴ؤ��Ƥϡ������κǸ�ΰ�ʬ�򻲾ȤΤ��ȡ�*0)��
Dan the Happy-Go-Lucky Perl Monger
use strict; use warnings; my $depth = shift || 10; my $debug = shift; for my $pkg (qw/Return Noself Goto/) { no strict 'refs'; *{ $pkg . '::0::new' } = sub { my $thing = shift; my $class = ref $thing || $thing; my $self = ref $thing && $thing; $self ||= []; bless $self => $class; $self->init() if $self->can('init'); return $self; }; } for my $child ( 1 .. $depth ) { my $parent = $child - 1; eval qq{ package Return::$child; our \@ISA = qw/Return::$parent/; sub init{ my \$self = shift; push \@{\$self}, __PACKAGE__; \$self->SUPER::init() if \$self->can('SUPER::init'); return \$self; }; }; die $@ if $@; eval qq{ package Noself::$child; our \@ISA = qw/Noself::$parent/; sub init{ push \@{ \$_[0] }, __PACKAGE__; \$_[0]->SUPER::init() if \$_[0]->can('SUPER::init'); return \$_[0]; }; }; die $@ if $@; eval qq{ package Goto::$child; our \@ISA = qw/Goto::$parent/; sub new { my \$class = shift; my \$self = bless [], \$class; \$self->init() if \$self->can('init'); \$self; } sub init{ push \@{\$_[0]}, __PACKAGE__; my \$super = \$_[0]->can('SUPER::init') or return \$_[0]; goto \$super; }; }; die $@ if $@; } if ($debug) { require Data::Dumper; for my $root (qw/Return Noself Goto/) { my $pkg = $root . '::' . $depth; my $o = $pkg->new; print Data::Dumper::Dumper($o); } exit; } use Benchmark qw/timethese cmpthese/; cmpthese( timethese( 0, { Return => sub { "Return::$depth"->new }, Noself => sub { "Noself::$depth"->new }, Goto => sub { "Goto::$depth"->new }, } ) );
���䡢��������虜�Ȥ餷������ĥ���������ȥ�ǻפ��Ф��Ƥ��ޤ��ä���