2012-05-27 47 views
14

Giả sử tôi có một lớp Perl có phương thức DESTROY. Phương thức này được sử dụng để phát hành ngầm một tài nguyên bên ngoài, chẳng hạn như một xử lý tệp hoặc giao dịch cơ sở dữ liệu.Làm thế nào để bạn phá hủy một đối tượng trong Perl một cách rõ ràng?

Cho một phiên bản của lớp này, tôi muốn phá hủy nó một cách rõ ràng. Mục đích chính của việc này là làm cho phương thức DESTROY được gọi để tài nguyên bên ngoài có thể được giải phóng. Tuy nhiên, có "đối tượng" tự phát hành từ bộ nhớ sẽ là một lợi ích bổ sung.

Tôi làm cách nào để thực hiện việc này? Tôi đã xem xét trực tiếp gọi phương thức DESTROY và định nghĩa bất kỳ biến nào tham chiếu đến đối tượng.

Trả lời

17

Đối tượng Perl5 bị hủy ngay khi tham chiếu cuối cùng biến mất, trừ khi bạn có cấu trúc tự tham chiếu (xem DestructorsThu gom rác hai pha đoạn sau đó cho một số thông tin thú vị).

Nếu bạn không có tự tham khảo, bạn không cần phải lo lắng về bất cứ điều gì, phương pháp DESTROY sẽ được gọi khi cần; cố gắng tự hủy đối tượng sẽ không an toàn (làm thế nào bạn có thể chắc chắn đối tượng không tham chiếu ở nơi khác), trừ khi bạn cũng đang tính toán tham chiếu (nếu điều đó thực sự có thể, và đó sẽ là nhân đôi nỗ lực của perl, không phải là một ý tưởng hay).

Vì vậy, tôi muốn nói, miễn là bạn không có tài liệu tham khảo theo chu kỳ:

  • Nếu bạn muốn phát hành nguồn lực bên ngoài ở một thời điểm cụ thể trong mã của bạn, làm như vậy một cách rõ ràng với một release/close/dispose/bất kỳ phương thức nào (mã DESTROY của bạn cũng có thể gọi).
  • Nếu bạn không thực sự quan tâm rằng bản phát hành đó xảy ra chính xác tại thời điểm đó trong mã của bạn, chỉ cần nó được gọi là cuối cùng, đừng lo lắng về nó.
  • Đừng lo lắng về chính đối tượng perl.

Nếu bạn có tham chiếu tuần hoàn, bạn sẽ cần cẩn thận hơn nhiều và sử dụng tham chiếu yếu (xem Scalar::Util) để ngắt vòng.

(Nói cách khác, tôi không biết một cách rõ ràng để delete một đối tượng perl. Điều đó không làm việc tốt với một hệ thống thu gom rác thải tham khảo-tính.)

+0

Bạn có chắc chắn rằng các đối tượng bị phá hủy chính xác sau khi chúng trở nên không được quan tâm? Bạn có biết bất kỳ nguồn có thẩm quyền nào xác nhận nó không? Tôi nghĩ rằng loại hành vi đó không được bảo đảm bởi người thu gom rác. – Sam

+1

Tài liệu tôi trích dẫn: "Khi tham chiếu cuối cùng đối tượng bị biến mất, đối tượng sẽ tự động bị hủy". Nhưng như tôi đã nói, làm cho nó rõ ràng nếu bạn muốn phát hành tài nguyên bên ngoài tại một điểm nhất định. Điều này là cho perl5 btw, perl6 có khả năng có một lược đồ thu thập sự khác biệt. – Mat

4

Bạn có thể sử dụng undef để tiêu diệt một đối tượng một cách rõ ràng. Mã dưới đây minh họa nó.

package MyPackage; 

sub new { 
    print "In new\n"; 
    return bless {}; 
} 

sub DESTROY { 
    print "In DESTROY\n"; 
} 

package main; 

my $Obj = MyPackage->new(); 
<STDIN>; 
undef $Obj; 
<STDIN>; 
+11

'undef' chỉ phá hủy đối tượng nếu những gì bạn cung cấp cho nó là tham chiếu cuối cùng. Hãy thử thêm 'my $ Cpy = $ Obj;' trước 'undef', bạn sẽ không thấy hủy được gọi trước khi kết thúc chương trình. – Mat

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