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! :-)
Bạn có thể đưa ra ví dụ về bất kỳ mô-đun nào như vậy không? – Borodin
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ó. –
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