Suppression d'objets dans la v15En JSL, je peux définir une classe et l'utiliser comme modèle pour instancier des objets.
Comment supprimer l'objet ?
J'ai utilisé le message deleteClass, en supposant que c'est un léger abus de langage et qu'il supprime vraiment l'objet.
Mais dans la version 15, il semble vraiment supprimer la classe.Une fois que j'utilise le message, je ne parviens pas à créer d'autres instances de la classe.
Je peux utiliser un message de suppression mais je pense que c'est juste un alias pour deleteClass et j'ai le même problème.
La suppression de la classe est-elle vraiment destinée à effacer toute la définition de la classe ?Si oui, quelle est la bonne façon de supprimer l'objet ?
Voici un script de test 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 : Suppression d'objets dans la v15Merci à tous, je pense que la preuve est claire que la réaffectation d'une variable d'objet détruit l'objet plutôt que de le laisser orphelin en mémoire,
Re : Suppression d'objets dans la v15Il semble que cela l'écrase si vous écrasez simplement la variable.L'Iran
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);
En regardant l'utilisation de la mémoire de JMP et cela n'a pas vraiment bougé.Je m'attendrais à ce que si ce n'était pas en train de l'écraser, je verrais la mémoire augmenter si j'en avais un million.
Re : Suppression d'objets dans la v15Je ne comprends pas non plus comment l'utiliser. Je pense que tu n'en as pas besoin :
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();Pinging v1-PC [::1] avec 32 octets de données :
Réponse de ::1 : temps<1 ms
Réponse de ::1 : temps<1 ms
Réponse de ::1 : temps<1 ms
Réponse de ::1 : temps<1 ms
Réponse de ::1 : temps<1 ms
Réponse de ::1 : temps<1 ms
Le programme externe produisait une sortie lorsque l'objet RunProgram a été détruit.
Utilisez une variable JSL pour contenir l'objet RunProgram.
En option, envoyez des messages à la variable pour gérer la durée de vie de l'objet.
lcaa42:b = 42,1 ;
lcaa43:b = 43 ;
// Classe aa
_init_ = Method( {a}, this:b = a );
m1 = Méthode( {a, b}, a * b );
x = 1 ;
Cela montre que le premier objet a été supprimé en attribuant une nouvelle valeur à la variable qui le contient.
Si d'autres variables sont copiées (non clonées)
lcaa42b=lcaa42;
alors toutes les copies doivent être effacées pour détruire l'objet.
lcaa42b=0;
lcaa42=0;
@EvanMcCorkle
Re : Suppression d'objets dans la v15Je ne sais pas.
Avant qu'il ne soit possible de "définir des classes", je les ai créées à l'aide d'espaces de noms.
Pour les espaces de noms, cela ne fonctionne pas, c'est-à-dire que définir la variable sur manquante n'est pas la même chose que supprimer l'espace de noms.
ns = newNamespace("xyz");
ns:a = 10;
ns = .;
show namespaces();Re : Suppression d'objets dans la v15Est-ce que ça marche : obj = .;