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 => \"e, ); } sub unimport { overload::remove_constant( integer => \&integer, # q => \"e, ); } 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の使い方