14

Date::Simpleオブジェクトはこの動作を表示し$date++、翌日の日付を返します。

Date::Simpleオブジェクトは不変です。$date1を$date2に割り当てた後、$date1を変更しても$date2に影響を与えることはできません。これは、たとえば、set_year操作のようなものはなく、$date++が新しいオブジェクトを$dateに割り当てることを意味します。

特定のアクションを実行する、++$objectまたは実行するなど、オブジェクトの増分前/増分後の動作をカスタム定義するにはどうすればよいですか?$object--

perlbootperltootperltoocperlbotをざっと見てきましたが、これを行う方法を示す例はありません。

4

2 に答える 2

12

あなたが欲しいoverload

package Number;

use overload
    '0+'    => \&as_number,
    '++'    => \&incr,
;

sub new {
    my ($class, $num) = @_;

    return bless \$num => $class;
}

sub as_number {
    my ($self) = @_;

    return $$self;
}

sub incr {
    my ($self) = @_;

    $_[0] = Number->new($self->as_number + 1); # note the modification of $_[0]
    return;
}

package main;

my $num = Number->new(5);
print $num      . "\n"; # 5
print $num++    . "\n"; # 5
print ++$num    . "\n"; # 7
于 2010-05-03T06:44:18.853 に答える
7

perlfaq7を調べると、答えはオーバーロードプラグマを使用することであることがわかりますが、おそらく FAQ の質問にもっと良い名前を付けることができたはずです (私の意見では)。

package SomeThing;

use overload
  '+' => \&myadd,
  '-' => \&mysub;

基本的に (がクラス$aのオブジェクトであり、そうではない場合)、上記はbeおよびto にオーバーロードされます(つまり、3 番目の引数はブール値であり、「この演算子への引数が反転したか」を意味し、最初の引数は is です) -self 構文は保持されます)、および についても同様です。SomeThing$b$a + $b$a->myadd($b, 0)$b + $a$a->myadd($b, 1)-mysub

完全な説明については、ドキュメントを参照してください。

于 2010-05-03T06:32:35.260 に答える