�Ȥ����櫓�ǡ����֡�

camel 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 = 1
           Rate 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 },
        }
    )
);

*0

�ӥǥ������Ť餤�����ϡ�������ǰ�̣�򸡺�!

yapoo