Eliminazione di oggetti nella v15In JSL posso definire una classe e usarla come modello per creare un'istanza di oggetti.
Come cancello l'oggetto?
Ho usato il messaggio deleteClass, supponendo che sia un nome leggermente improprio e che stia davvero eliminando l'oggetto.
Ma nella versione 15 sembra davvero eliminare la classe.Una volta utilizzato il messaggio, non sono in grado di creare ulteriori istanze della classe.
Posso usare un messaggio di eliminazione ma penso che sia solo un alias per deleteClass e ho lo stesso problema.
La classe di eliminazione è davvero destinata a cancellare l'intera definizione della classe?In tal caso, qual è il modo corretto di eliminare l'oggetto?
Ecco un semplice script di prova:
names default to here(1);
defineClass("MyClass",{
_value = .,
_init_ = method({value},
_value = value;
),
getValue = method({},
return(_value)
)
});
// this works
obj = newObject( MyClass( 10 ) );
show(obj:getvalue);
// this works
obj = newObject( MyClass( 20 ) );
show(obj:getvalue);
// there should be no harm deleting
// an object once I am finished with it
obj<<DELETE></DELETE>
Re: Eliminazione di oggetti nella v15Grazie a tutti, penso che l'evidenza sia chiara che la riassegnazione di una variabile oggetto distrugge l'oggetto piuttosto che lasciarlo orfano in memoria,
Re: Eliminazione di oggetti nella v15Sembra che lo stia sovrascrivendo se si sovrascrive semplicemente la variabile.Ho corso
Names Default To Here( 1 );
Define Class(
"Test",
nObs = 20;
addition = Method( {x, y},
(x + y) * nObs
);
append = Method( {a, b},
Char( a ) || " + " || Char( b )
);
);
for(i=1, i<=1000000, i++,
clref = New Object( Test() );
);
delete symbols(clref);
Durante l'esame dell'utilizzo della memoria di JMP e non si è davvero spostato.Mi aspetterei che se non lo sovrascrivesse, vedrei aumentare la memoria se ne avessi un milione.
Re: Eliminazione di oggetti nella v15Non capisco neanche io come usarlo. Penso che non ti serva:
Define Class(
"aa",
{_init_ = Method( {a}, this:b = a ), //
x=1, //
m1 = Method( {a, b}, a * b )}
);
//
lcaa42 = New Object( aa(42) );
lcaa42:x= Run Program(//
Executable( "PING.EXE" ), //
Options( {"-n 50", "localhost"} ), //
ReadFunction(
Function( {this},
write(this << read);
)
)
);
wait(5); // report about 5 of the 50 pings to the log
// this will destroy the old object and replace it with a
// new one. The log will report the RunProgram object was
// destroyed; there may be a more clever way to witness the
// destruction...best I could come up with...
lcaa42 = New Object( aa(42.1) ); // the old one is gone
lcaa43 = New Object( aa(43) ); // the class still works
show(lcaa42:b,lcaa43:b); // 42.1,43
Show Classes();Ping v1-PC [::1] con 32 byte di dati:
Rispondi da ::1: tempo<1ms
Rispondi da ::1: tempo<1ms
Rispondi da ::1: tempo<1ms
Rispondi da ::1: tempo<1ms
Rispondi da ::1: tempo<1ms
Rispondi da ::1: tempo<1ms
Il programma esterno stava producendo output quando l'oggetto RunProgram è stato distrutto.
Utilizzare una variabile JSL per contenere l'oggetto RunProgram.
Facoltativamente, inviare messaggi alla variabile per gestire la durata dell'oggetto.
lcaa42:b = 42,1;
lcaa43:b = 43;
// Classe aa
_init_ = Metodo( {a}, this:b = a );
m1 = Metodo( {a, b}, a * b );
x = 1;
Questo mostra che il primo oggetto è stato cancellato assegnando un nuovo valore alla variabile che lo conteneva.
Se vengono copiate altre variabili (non clonate)
lcaa42b=lcaa42;
quindi tutte le copie devono essere cancellate per distruggere l'oggetto.
lcaa42b=0;
lcaa42=0;
@EvanMcCorkle
Re: Eliminazione di oggetti nella v15Non lo so.
Prima che fosse possibile "definire le classi" le ho create usando gli spazi dei nomi.
Per gli spazi dei nomi questo non funziona, ad esempio impostare la variabile su mancante non equivale a eliminare lo spazio dei nomi.
ns = newNamespace("xyz");
ns:a = 10;
ns = .;
show namespaces();Re: Eliminazione di oggetti nella v15Funziona così: obj = .;