YAPC::KANSAI 2017 LT
-
Upload
maka2donzoko -
Category
Technology
-
view
208 -
download
0
Transcript of YAPC::KANSAI 2017 LT
package Foo;overload (‘+’ => sub { ... },‘-’ => sub { ... },
);...my $foo = Foo->new;$foo + 1;3 - $foo;$foo--;
package Time::Piece::YYYYMMDD;use strict;use warnings;
BEGIN {require Exporter;our @ISA = qw(Exporter);our @EXPORT = qw(mm dd yyyy);
}
use parent 'Time::Piece';
19 / 244
sub yyyy {_make_obj('%Y', shift);
}
sub mm {_make_obj('%m', shift);
}
sub dd {_make_obj('%d', shift);
}
20 / 244
sub _make_obj {my ($type, $obj) = @_;if ( defined $obj ) {if ( $obj->isa('Time::Piece::YYYYMMDD::Object') ) {push @{$obj->{types}}, $type;return $obj;
}else { # $obj is a Time::Piece::YYYYMMDDbless { t => $obj, types => [$type] }, 'Time::Piece::YYYYMMDD::Object';
}}else {bless { t => undef, types => [$type] }, 'Time::Piece::YYYYMMDD::Object';
}}
21 / 244
package Time::Piece::YYYYMMDD::Object;
use overload ('-' => _kigo('-'),'/' => _kigo('/'),
);
22 / 244
BEGIN {sub _kigo {
my ( $kigo ) = @_;return sub { # オーバーロードされた演算子で呼ばれる
my ( $self, $other, $swap ) = @_;my $t = $self->{t};my $type = $self->{type};
if ($swap) {push @{ $self->{types} }, $kigo;return $self;
}else {
push @{ $other->{types} }, $kigo;}
my @types = (@{$self->{types}}, reverse(@{$other->{types}}));
return $t->strftime(join('', @types));};
}}
use Time::Piece::YYYYMMDD;
my $t = Time::Piece::YYYYMMDD->new;$t->yyyy-mm-dd;
####
$ perl -MO=Deparse test.pl
25 / 244
use Time::Piece::YYYYMMDD;
my $t = Time::Piece::YYYYMMDD->new;$t->yyyy-mm-dd;
####
$ perl -MO=Deparse test.pl
$t->yyyy - mm(-dd());
26 / 244
$t->yyyy - mm(-dd());
dd() が呼ばれ%Dをスタックに積んだオブジェクト返す
-が呼ばれ – をさっきのオブジェクトのスタックに積む
mm() が呼ばれ%Mをスタックに積む
-が呼ばれ – をスタックに積む。さらに
yyyy() で返されたオブジェクトを引数で受けてるのでここまでの情報が積まれたオブジェクトとがっちゃんこ
27 / 244
say $t->yyyy-mm-dd;2017-03-04say $t->mm-dd;03-04say $t->yyyy-mm;2017-03 say $t->dd-mm-yyyy;04-03-2017say $t->mm/dd;03/04
30 / 244
say $t->yyyy-mm-dd;2017-03-04say $t->mm-dd;03-04say $t->yyyy-mm;2017-03 say $t->dd-mm-yyyy;04-03-2017say $t->mm/dd;03/04
33 / 244