2013-08-21 21 views
5

W Perl, jest to łatwe do błogosławić hashref i używać go do przechowywania i odczytu właściwości:Jak obsługiwać właściwości w klasie Perl opartej na 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}; 
} 

Ale Widziałem niektórych klas (z różnych modułów Perl), że po cenach dumpingowych, pokazać prosty skalar pobłogosławiony:

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

Jednak mają metody i właściwości. Metody, które rozumiem, wszelkie podprogramy wywołania pakietu can będą wywoływane, gdy proszą o błogosławioną $object->name. Część, której nie rozumiem, to sposób, w jaki mogą przechowywać nieruchomości. Gdzie są przechowywane te nieruchomości?

Kilka razy akceptują takie rzeczy, jak $obj->property = $x lub $obj->property($x) i mogą być niezależne od innych instancji tej samej klasy. Gdzie są przechowywane te nieruchomości?

Wiem, że to naprawdę zależy od podstawowej implementacji Klasy, co robi i do czego wchodzi w interakcję, i które może faktycznie odpowiedzieć na to pytanie kilka razy (np. Obiekt jest po prostu powiązany z innym obiektem lub połączeniem gdzieś i tylko wysyłanie lub wysyłanie wartości do niego).

Jeśli jednak istnieje sposób, aby obiekt oparty na skalarach zapisywał właściwości (jak w innej koncepcji lub podejściu do struktury klas w Perlu), naprawdę chciałbym to wiedzieć.

Z góry dziękujemy za wszelkie uwagi! :-)

+0

Czy możesz podać przykłady takich modułów? – Borodin

+0

Naprawdę nie śledzę, jest to po prostu coś, co sprawiało, że mam coraz więcej ciekawości za każdym razem, gdy ją widzę, co jest naprawdę tylko wtedy, gdy faktycznie próbuję zrzucić obiekt, aby zobaczyć pewne wartości. Jednym z przykładów, który przychodzi mi teraz na myśl, jest GD. Utwórz "nowy GD :: Obraz", a następnie go zrzuć. –

+0

GD :: Obraz byłby przykładem klasy opartej na XS, ponieważ jest to powiązanie Perla z [libgd] (http://www.libgd.org/). – cjm

Odpowiedz

8

Jednym ze sposobów jest użycie inside-out objects. Innym jest użycie klasy opartej na XS, w której skalar przechowuje adres struktury C/C++, w której przechowywane są właściwości (zwykle odbywa się to tylko wtedy, gdy celem klasy jest interfejs z biblioteką C/C++).

Można również zrobić coś dziwnego, jak części indeksu skalarnego, używając substr lub pack, ale wątpię, czy ktoś to zrobił, poza udowodnieniem, że można to zrobić.