2010-05-03 2 views
14

Date::Simple 개체는이 동작을 표시하며 $date++은 다음날 날짜를 반환합니다.Perl 객체에서 사전/사후 증가 동작을 어떻게 정의 할 수 있습니까?

날짜 :: 단순 개체는 변경할 수 없습니다. $ date1을 $ date2에 할당하면 $ date1을 변경해도 $ date2에 영향을 미칠 수 있습니다. 예를 들어, set_year 연산과 같은 것이없고, $ date ++는 $ date에 새 오브젝트를 할당합니다.

어떻게 수있는 하나 개의 맞춤 정의 ++$object 또는 $object--가 특정 작업을 수행하도록, 물체의 사전/사후 증분 행동을?

나는 perlboot, perltoot, perltoocperlbot을 통해 미끄러 져했지만, 나는 어떤 예는이 작업을 수행 할 수있는 방법을 보여주는 표시되지 않습니다.

+1

확인했는데 이것은 속임수가 아님을 분명히했습니다. 오랜 시간 전에 여기 있어야했던 질문에 +1하세요. –

답변

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 
+0

편집 해 주셔서 감사합니다. cjm; 이제 나는 link-to-docs convention을 안다. :) – darch

+1

+1 좋은 예. 다른 사람들이 그 차이를 보거나 느낄 수 있도록'++ '의 비표준을 비표준으로 만들고 싶을지도 모른다. – Zaid

7

perlfaq7을 보면 대답이 overload라는 플러그 마크를 사용하는 것으로 나타 났지만 FAQ 질문에 더 나은 이름이 부여되었을 수 있습니다 (필자의 의견으로는).

package SomeThing; 

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

기본적 위에서 $a->myadd($b, 1)-$a->myadd($b, 0)$b + $a (즉, 세 번째 인자는 "부울 의미이다 하였다 될 $a + $b 과부하 것 (AN SomeThing 클래스의 오브젝트 및 $b하지 $a를이다 가정) 이 연산자에 대한 인수가 뒤집 혔고 첫 번째 인수 자체 구문이 보존 됨) -mysub에 대해서도 동일합니다.

자세한 설명은 설명서를 참조하십시오.

+0

쿨! 이것은 모든 종류의 가능성을 열어줍니다 ... – Zaid

+2

허, 그건 FAQ에 대한 끔찍한 제목입니다. 그것은 또한 꽤 가난한 대답입니다. 나는 그것을 수정해야 할 것들에 추가 할 것이다. –

관련 문제