2010-05-03 26 views
14

Date::Simple đối tượng hiển thị hành vi này, trong đó $date++ trả về ngày hôm sau.Làm cách nào để xác định hành vi trước/sau tăng trong các đối tượng Perl?

Ngày :: Đối tượng đơn giản là không thay đổi. Sau khi gán $ date1 cho $ date2, không thay đổi thành $ date1 có thể ảnh hưởng đến $ date2. Điều này có nghĩa là, ví dụ: không có gì giống như thao tác set_year và $ date ++ gán đối tượng mới cho $ date.

Làm thế nào có thể một tùy chỉnh xác định/hành vi sau gia tăng tiền của một đối tượng, chẳng hạn rằng ++$object hoặc $object-- thực hiện một hành động cụ thể không?

Tôi đã đọc lướt qua perlboot, perltoot, perltoocperlbot, nhưng tôi không thấy bất kỳ ví dụ nào cho thấy cách thực hiện việc này.

+1

Tôi đã kiểm tra và dường như đây không phải là sự lừa đảo. 1 cho một câu hỏi mà có lẽ nên đã được lên ở đây một thời gian dài trước đây. –

Trả lời

12

Bạn muốn 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

Cảm ơn bạn đã chỉnh sửa, cjm; bây giờ tôi biết quy ước liên kết tới tài liệu. :) – darch

+1

+1 Ví dụ hay. Bạn có thể muốn làm cho hành vi của '++' không chuẩn để người khác có thể thấy/cảm nhận sự khác biệt – Zaid

7

Nếu bạn tra cứu perlfaq7 bạn sẽ thấy rằng câu trả lời là sử dụng overload pragma, mặc dù chúng có thể đã đặt câu hỏi thường gặp cho một tên tốt hơn (theo ý kiến ​​của tôi).

package SomeThing; 

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

Về cơ bản (giả sử $a là một đối tượng của lớp SomeThing$b không), ở trên sẽ quá tải $a + $b$a->myadd($b, 0)$b + $a-$a->myadd($b, 1) (có nghĩa là, đối số thứ ba là một ý nghĩa boolean "là các đối số cho toán tử này được lật "và cú pháp đầu tiên-đối số-là-tự được giữ nguyên) và giống nhau cho -mysub.

Đọc tài liệu để biết giải thích đầy đủ.

+0

Tuyệt vời! Điều này mở ra tất cả các loại khả năng ... – Zaid

+2

Huh, đó là một tiêu đề khủng khiếp cho một câu hỏi thường gặp. Nó cũng là một câu trả lời khá nghèo nàn. Tôi sẽ thêm nó vào danh sách những thứ cần sửa. –

Các vấn đề liên quan