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! :-)
Puoi fornire esempi di tali moduli? – Borodin
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. –
GD :: Image sarebbe un esempio di una classe basata su XS, poiché è un collegamento Perl a [libgd] (http://www.libgd.org/). – cjm