2013-08-21 34 views
5

Trong Perl, thật dễ dàng để ban phước cho một hashref và sử dụng nó để lưu trữ và đọc thuộc tính:Làm cách nào để xử lý các thuộc tính trên lớp Perl dựa trên SCALAR?

package MyPackage; 
use strict; 
use warnings; 

sub new { 
    bless {}, __PACKAGE__; 
} 

sub SomeProperty { 
    my $self = shift; 
    if (@_) { 
     return $self->{SomeProperty} = shift; 
    } 
    $self->{SomeProperty}; 
} 

# Or even like this to be able to call $obj->OtherProperty = $x; 

sub OtherProperty : lvalue { 
    my $self = shift; 
    $self->{OtherProperty}; 
} 

Nhưng, tôi đã nhìn thấy một số lớp (từ module Perl khác nhau), khi đổ, cho thấy một vô hướng đơn giản may mắn:

$obj = bless(\$8756489, 'Some::Package'); 

Tuy nhiên, họ có phương pháp và thuộc tính. Các phương thức tôi hiểu, bất kỳ chương trình con nào, một cuộc gọi gói can sẽ được gọi khi yêu cầu một số $object->name may mắn. Phần tôi không hiểu là cách họ có thể lưu trữ các thuộc tính. Các thuộc tính đó được lưu trữ ở đâu?

Một vài lần họ chấp nhận những thứ như $obj->property = $x hoặc $obj->property($x) và có thể độc lập với các phiên bản khác của cùng một Lớp. Các thuộc tính đó được lưu trữ ở đâu? Tôi biết điều đó thực sự phụ thuộc vào việc triển khai thực hiện lớp, những gì nó đang làm hoặc những gì nó tương tác, và thực sự có thể trả lời câu hỏi nhiều lần (ví dụ: đối tượng chỉ giao tiếp với một đối tượng khác hoặc kết nối ở đâu đó và chỉ gửi hoặc quering giá trị cho nó).

Tuy nhiên, nếu có cách để đối tượng dựa trên vô hướng lưu trữ các thuộc tính (như trong một khái niệm hoặc cách tiếp cận khác với cấu trúc lớp trong Perl), tôi thực sự muốn biết nó.

Cảm ơn bạn trước vì đã nhận xét! :-)

+0

Bạn có thể đưa ra ví dụ về bất kỳ mô-đun nào như vậy không? – Borodin

+0

Tôi thực sự không theo dõi, nó chỉ là thứ khiến tôi ngày càng tò mò mỗi khi tôi nhìn thấy nó, thực sự chỉ là những lúc mà tôi thực sự cố gắng đổ một vật thể để xem một vài giá trị. Một ví dụ mà tôi nghĩ đến bây giờ là GD. Tạo một 'GD mới :: Hình ảnh' và sau đó đổ nó. –

+0

GD :: Hình ảnh sẽ là một ví dụ về lớp dựa trên XS, vì đó là một ràng buộc Perl với [libgd] (http://www.libgd.org/). – cjm

Trả lời

8

Vâng, một cách là sử dụng inside-out objects. Một cách khác là sử dụng lớp dựa trên XS, nơi vô hướng lưu trữ địa chỉ của cấu trúc C/C++ trong đó các thuộc tính được lưu trữ (điều này thường được thực hiện chỉ khi mục đích của lớp là giao tiếp với thư viện C/C++).

Bạn cũng có thể làm điều gì đó kỳ lạ như các phần chỉ mục của vô hướng sử dụng substr hoặc pack, nhưng tôi nghi ngờ bất kỳ ai đã làm điều đó ngoại trừ việc chứng minh điều đó có thể được thực hiện.

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