Câu hỏi "How can I monkey-patch an instance method in Perl?" khiến tôi suy nghĩ. Tôi có thể xác định lại các phương pháp Perl động không? Giả sử tôi có một lớp học như thế này:Làm thế nào tôi có thể xác định lại các phương thức lớp Perl?
package MyClass;
sub new {
my $class = shift;
my $val = shift;
my $self = { val=> $val};
bless($self, $class);
return $self;
};
sub get_val {
my $self = shift;
return $self->{val}+10;
}
1;
Và giả sử thêm hai số thực sự đắt tiền.
Tôi muốn sửa đổi lớp để $ val + 10 chỉ được tính lần đầu tiên tôi gọi phương thức trên đối tượng đó. Các cuộc gọi tiếp theo đến phương thức sẽ trả về giá trị được lưu trong bộ nhớ cache.
tôi có thể dễ dàng sửa đổi phương pháp để bao gồm bộ nhớ đệm, nhưng:
- tôi có một loạt các phương pháp như thế này.
- Tôi không muốn làm hỏng phương pháp này.
Điều tôi thực sự muốn làm là chỉ định danh sách các phương thức mà tôi biết luôn trả về cùng một giá trị cho một trường hợp cụ thể. Sau đó tôi muốn lấy danh sách này và chuyển nó vào một hàm để thêm hỗ trợ bộ nhớ đệm vào các phương thức đó
Có cách nào hiệu quả để thực hiện việc này không?
Theo dõi. Mã bên dưới hoạt động, nhưng vì sử dụng nghiêm ngặt không cho phép tham chiếu theo chuỗi, tôi không phải là 100% nơi tôi muốn.
sub myfn {
printf("computing\n");
return 10;
}
sub cache_fn {
my $fnref = shift;
my $orig = $fnref;
my $cacheval;
return sub {
if (defined($cacheval)) { return $cacheval; }
$cacheval = &$orig();
return $cacheval;
}
}
*{myfn} = cache_fn(\&myfn);
Làm thế nào để sửa đổi để chỉ làm điều này ?:
cache_fn(&myfn);
{không có cảnh báo 'Định nghĩa lại'; Hãy xem câu trả lời mới của tôi về cache_fn (&myfn); – draegtun
Bạn có thể muốn xem xét việc ghi nhớ (có một số mô-đun CPAN tốt) hoặc sử dụng trình kích hoạt Moose để lưu vào bộ nhớ cache tốn kém tính toán trong các thuộc tính và tính toán lại chúng khi cần thiết với trigger – Ether