読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

overloadでマジックデクリメント

そういえば演算子ってオーバーロードができたなーと思って前々回のマジックデクリメントをやってみた。
結論から言うとまだできてない。
なぜか以下のエラーが出てくる。

Operation "=": no method found, argument in overloaded package MagicDecrement at ./magic.pl line 10.

とりあえずイメージとしては「use MagicDecrement;」で「--」の意味を変えてしまいたいのだけれど……。
「=」も変えなくちゃいけないの?

package MagicDecrement;
use strict;
use warnings;
use overload
  q(--) => \&decrement,
  q("") => \&dbl_quote;

sub import {
  overload::constant(
    integer => \&integer,
#   q => \&quote,
  );
}
sub unimport {
  overload::remove_constant(
    integer => \&integer,
#   q => \&quote,
  );
}

sub integer {
  my ($orig, $interp, $context) = @_;
  return bless { integer => $interp };
}
#sub quote {
#  bless { quote => $_[1] };
#}

sub decrement {
#  $_[0]{integer} = $_[0]{integer} - 1;
#  my ($class, $int) = @_;
#  ${$int} = ${$int} - 1;
#  bless $int, $class;
#  $_[0]{integer};
# ?
}
sub dbl_quote {
#  exists $_[0]{integer} ? $_[0]{integer} : $_[0]{quote}
  $_[0]{integer}
}

1;
__END__

参考にしつつの、「プログラミングPerl Vol.1」では同じような例があって、そっちではインスタンスをデクリメントしてるからエラーが出てないのかなー?


目標としては、数値と文字列の両方でデクリメントを実現させたい。
もうちょっとがんばる。


参考:
overload - Perl の演算子のオーバーロードを行うパッケージ - perldoc.jp教えて! Watch - overloadの使い方