Syntaxe
Crée un handle : une valeur qui désigne une variable. On peut le stocker, le passer et le rendre, puis lire ou écrire la variable à travers lui.
@<target>
<name> AS HANDLE [= @<target>]
<name> AS POINTER [= @<target>]
GetRef(<name>)
SetRef(<name>, <value>)
IsRef(<name>)
ReleaseRef(<name>)S’écrit aussi : @, HANDLE, POINTER
Les éléments
| <target> | Ce que le handle désigne : une variable, un champ d’enregistrement (@hero.hp), un élément de tableau (@scores[1]), l’élément courant d’une liste ou une entrée de map (@names("ann")). |
|---|---|
| <name> | Une variable qui contient un handle. HANDLE et POINTER sont le même type. Elle commence vide. |
| <value> | La valeur à écrire dans la cible. Elle est convertie dans le type de la cible. |
À savoir
@exige un emplacement qu’on peut affecter.@42est une erreur de compilation : « BASIC @ requires an assignable variable, field, array, list, or map element ».- Un handle garde sa cible en vie : un handle vers une variable
LOCALfonctionne encore après la fin de la fonction. - Le type de la cible l’emporte : à travers un handle vers une variable
AS uint8,SetRef(p, 300)range 44. - Après
ReleaseRef(), ou quand l’enregistrement qui porte le champ est supprimé,IsRef()est faux etGetRef()ouSetRef()arrêtent le programme (« BASIC reference handle has been released »). Une variableHANDLEjamais affectée se comporte pareil. TestezIsRef()en cas de doute. - Deux handles créés séparément ne sont jamais
=, même s’ils désignent la même variable. - Un handle n’est pas un nombre, contrairement au
@variablede PureBasic : pas d’arithmétique d’adresse, pas de conversion en entier, pas dePeekIni dePokeIà travers lui. - Un paramètre
REFvit le temps d’un appel. Un handle vit tant qu’on le garde, et peut être rangé dans un enregistrement ou rendu par une fonction.
Exemple
OPTION EXPLICITGLOBAL gold AS integer = 5FUNCTION AddGold(target AS HANDLE, amount AS integer) SetRef(target, GetRef(target) + amount)ENDFUNCTIONFUNCTION MakeCounter() AS HANDLE LOCAL counter AS integer = 0ENDFUNCTION @counterAddGold(@gold, 10)Console(Str(gold)) ' 15GLOBAL c AS HANDLE = MakeCounter()SetRef(c, GetRef(c) + 1)SetRef(c, GetRef(c) + 1)Console(Str(GetRef(c))) ' 2ReleaseRef(c)IF NOT IsRef(c) THEN Console("released") ' releasedDans le manuel : Fonctions