Après avoir rencontré quelques difficultés avec la portée des variables, je vous propose un précis sur le sujet :

Petit rappel : Une variable permet de stocker des valeurs de façon temporaire ou non dans des noms. On pourra en suite faire appel àces noms n'importe où dans notre code.
Si cette gestion de l'information semble suffisante dans un petit script, il n'en va pas de même pour de longs codes (comme ceux dont nous gratifient Krikroff ou Steven)
En effet, il serait catastrophique que des fonctions différentes utilisent le même nom de variable pour y stocker des valeurs !!! Les variables seraient alors écrasées ... Et ça c'est pas bon...

La solution est de limiter la portée d'une variable en utilisant la notion de variable locale. Ainsi la variable locale n'aura d'existence que dans le bloc dans laquelle elle a été crée !

Mais qu'est-ce qu'un bloc ?
Et bien c'est par exemple ce qui est situé entre if et end, ou entre do et end, ou encore une fonction ...

Ben alors comment qu'on va faire maintenant ?

Déjà, on a de la chance, puisque le Lua utilise ces 2 types de variables et que c'est super simple de les créer !

Les variables Globales sont crées simplement en tapant leur nom suivi d'un "=" et de la valeur numérique souhaitée ou du texte entre "" ou ' ' : MaVariableGlobale = 1 Attention : Fibaro propose en plus une gestion particulière des variables Globales par le biais de son Panneau variables. Il sera donc inutile de la déclarer ànouveau dans votre code pour l'utiliser. Cette gestion permet d'utiliser une même variable commune àtoutes les scènes ou modules de votre HC2.


Les variables Locales sont quant àelles créées en ajoutant cette fois le mot local devant le nom de la variable (c'est ce mot clé qui restreint sa portée àun bloc ou àune fonction) : local MaVariableLocale = 2 Attention : Pour changer la valeur de cette variable locale il ne sera plus nécessaire de mettre le mot clé "local" devant !
Bon après ça dépend de ce que vous souhaitez faire... Mettre àjour la variable ou en créer une nouvelle (voir plus bas *)

Mais c'est peut-être ce que vous voulez finalement ?
Oui et non
Il faudra être vigilant quant àla portée que l'on souhaite donnée àsa variable et choisir qu'elle soit locale ou globale.

En effet, dans une fonction, il peut être intéressant d'utiliser une variable et d'être certain qu'il n'y aura pas de conflit avec un nom que vous auriez utilisé avant.
C'est làque vous allez utiliser la puissance de la variable LOCALE !

Voici un exemple de la portée d'une variable locale (regardez la valeur retournée par le début).
On voit clairement que nous avons àfaire à2 variables locales : local MaVarLocale = 1 fibaro:debug(MaVarLocale) -- donne 1 do local MaVarLocale = 5 -- création d'une nouvelle variable locale au sein du bloc (rien àvoir avec celle créée ligne 2 !) fibaro:debug(MaVarLocale) -- donne 5 end fibaro:debug(MaVarLocale) -- donne 1 Même si elles ont le même nom, elles ont été déclarées dans 2 blocs différents. Le système les considère comme complètement différentes àcause du mot clé local.


Le danger avec le Lua c'est que ce langage est très permissif et qu'àforce d'omission, on peut se prendre les pieds sans le tapis ...

Je m'explique en reprenant le même code qu'au dessus en supprimant le mot clé local : MaVariable = 1 -- création d'une variable globale fibaro:debug(MaVariable) -- donne 1 do MaVariable = 5 -- mise àjour de la variable globale créée ligne 2 fibaro:debug(MaVariable) -- donne 5 end fibaro:debug(MaVariable) -- donne 5 Ici nous n'avons àfaire qu'àune seule variable globale (elle s'appelle MaVariable ! Elle est considérée ici par le système comme globale car nous ne l'avons jamais déclarée avec le mot clé local.

Ok ! Alors maintenant vous vous dites : je vais déclarer ma variable MaVariable en local dès la première ligne (comme ça je suis tranquille) : local MaVariable = 1 -- création d'une variable locale fibaro:debug(MaVariable) -- donne 1 do MaVariable = 5 -- ici pas de mot clé local, donc mise àjour de la variable déclarée ligne 2 fibaro:debug(MaVariable) -- donne 5 end fibaro:debug(MaVariable) -- donne 5 (C'est ici plus bas * !!!) Ici il n'y a pas d'erreur ! Ce code est valable si vous souhaitiez vraiment utiliser la même variable locale (dans un nouveau bloc) que celle déclarée en locale au début de votre script (et donc la mettre àjour). La Variable est mise àjour et non créer au sein du nouveau bloc.

Le code suivant crée 4 variables locales MaVariable : local MaVariable = 0 -- création d'une variable locale do local MaVariable = 1 -- création d'une nouvelle variable locale (rien àvoir avec le ligne 2 end do local MaVariable = 2 -- création d'une nouvelle variable locale (rien àvoir avec le ligne 2 et 5 end do local MaVariable = 3 -- création d'une nouvelle variable locale (rien àvoir avec le ligne 2 ; 5 et 9) end Le code suivant crée 1 seule variable locale MaVariable et la met àjour 3 fois : local MaVariable = 0 -- création de la variable locale do MaVariable = 1 -- mise àjour de la variable déclarée ligne 2 end do MaVariable = 2 -- mise àjour de la variable déclarée ligne 2 et modifiée àla ligne 5 end do MaVariable = 3 -- mise àjour de la variable déclarée ligne 2, modifiée àla ligne 5 et modifiée ànouveau ligne 9 end Ce code utilise une seule variable Globale MaVariable car on a supprimé la 1ère ligne ! : -- On supprime la déclaration de la variable locale en la commentant : -- local MaVariable = 0 do MaVariable = 1 -- création de la variable globale ! end do MaVariable = 2 -- mise àjour de la variable globale ! end do MaVariable = 3 -- mise àjour de la variable globale ! end Subtile non ?! Une ligne en moins au début et on passe tout de local en globale !

Voilàpourquoi je disais que le côté permissif du Lua peut jouer des tours. Imaginez que vous vous trouviez àla tête de 1500 lignes de codes, il se pourrait que vous souhaitiez mettre àjour une variable globale (donc sans local devant) mais que malheureusement vous ayez àfaire àune variable locale déclarée quelques lignes au-dessus...

... En espérant que ce sujet vous ait été utile.