2013-08-21 16 views
5

In Perl, è facile per benedire una hashref e usarlo per memorizzare e leggere le proprietà:Come gestire le proprietà su una classe Perl basata su 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}; 
} 

Ma, ho visto alcune classi (da diversi moduli Perl) che, una volta scaricato, mostra un semplice scalare benedetto:

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

Tuttavia, hanno metodi e proprietà. I metodi che capisco, ogni subroutine che un pacchetto chiama can chiamerà quindi quando si chiederà a un benedetto $object->name. La parte che non sto capendo è come possono memorizzare le proprietà. Dove vengono archiviate queste proprietà?

Più volte accettano cose come $obj->property = $x o $obj->property($x) e possono essere indipendenti da altre istanze della stessa classe. Dove vengono archiviate queste proprietà?

So che in realtà dipende dall'implementazione di base della classe, da cosa sta facendo o da cosa sta interagendo, e che può effettivamente rispondere alla domanda più volte (ad esempio l'oggetto si interfaccia solo con un altro oggetto o connessione da qualche parte e solo inviandoci o chiedendogli dei valori).

Tuttavia, se esiste un modo per un oggetto basato su scalare per memorizzare le proprietà (come in un diverso concetto o approccio alla struttura di classi in Perl), mi piacerebbe davvero saperlo.

Grazie in anticipo per eventuali commenti! :-)

+0

Puoi fornire esempi di tali moduli? – Borodin

+0

Davvero non lo seguo, è solo qualcosa che mi ha fatto avere sempre più curiosità ogni volta che lo vedo, che è davvero solo in quei momenti in cui provo a scaricare un oggetto per vedere alcuni valori. Un esempio che mi viene in mente in questo momento è GD. Crea un 'nuovo GD :: Image' e poi esegui il dump. –

+0

GD :: Image sarebbe un esempio di una classe basata su XS, poiché è un collegamento Perl a [libgd] (http://www.libgd.org/). – cjm

risposta

8

Bene, un modo è utilizzare inside-out objects. Un altro consiste nell'utilizzare una classe basata su XS, in cui lo scalare memorizza l'indirizzo di una struttura C/C++ in cui sono memorizzate le proprietà (questo è normalmente fatto solo quando lo scopo della classe è di interfacciarsi con una libreria C/C++).

Si potrebbe anche fare qualcosa di strano come le parti dell'indice dello scalare usando substr o pack, ma dubito che qualcuno lo abbia fatto tranne che per dimostrare che potrebbe essere fatto.

Problemi correlati