Eliminar objetos en v15En JSL puedo definir una clase y usarla como plantilla para instanciar objetos.
¿Cómo elimino el objeto?
He estado usando el mensaje deleteClass, asumiendo que es un nombre ligeramente inapropiado y realmente está eliminando el objeto.
Pero en la versión 15 realmente parece eliminar la clase.Una vez que uso el mensaje, no puedo crear más instancias de la clase.
Puedo usar un mensaje de eliminación, pero creo que es solo un alias para deleteClass y tengo el mismo problema.
¿La clase de borrado realmente tiene la intención de eliminar toda la definición de clase?Si es así, ¿cuál es la forma correcta de eliminar el objeto?
Aquí hay un script de prueba simple:
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: Eliminar objetos en v15Gracias a todos, creo que la evidencia es clara de que reasignar una variable de objeto destruye el objeto en lugar de dejarlo huérfano en la memoria,
Re: Eliminar objetos en v15Parece que lo está sobrescribiendo si solo sobrescribe la variable.corrí
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);
Mientras miraba el uso de memoria de JMP y realmente no se movió.Esperaría que si no se sobrescribiera realmente, vería aumentar la memoria si tengo un millón de ellos.
Re: Eliminar objetos en v15Yo tampoco entiendo cómo usarlo. Creo que no lo necesitas:
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();Hacer ping a v1-PC [::1] con 32 bytes de datos:
Respuesta de ::1: tiempo<1ms
Respuesta de ::1: tiempo<1ms
Respuesta de ::1: tiempo<1ms
Respuesta de ::1: tiempo<1ms
Respuesta de ::1: tiempo<1ms
Respuesta de ::1: tiempo<1ms
El programa externo estaba generando resultados cuando se destruyó el objeto RunProgram.
Use una variable JSL para contener el objeto RunProgram.
Opcionalmente, envíe mensajes a la variable para administrar la vida útil del objeto.
lcaa42:b = 42,1;
lcaa43:b = 43;
// Clase aa
_init_ = Método( {a}, this:b = a );
m1 = Método( {a, b}, a * b );
x = 1;
Esto muestra que el primer objeto se eliminó asignando un nuevo valor a la variable que lo contiene.
Si se copian otras variables (no se clonan)
lcaa42b=lcaa42;
luego se deben borrar todas las copias para destruir el objeto.
lcaa42b=0;
lcaa42=0;
@EvanMcCorkle
Re: Eliminar objetos en v15No sé.
Antes de que fuera posible "definir clases", las creé usando espacios de nombres.
Para los espacios de nombres, esto no funciona, es decir, configurar la variable como faltante no es lo mismo que eliminar el espacio de nombres.
ns = newNamespace("xyz");
ns:a = 10;
ns = .;
show namespaces();Re: Eliminar objetos en v15¿Funciona esto: obj = .;