Portée des variables

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
lmet
Messages : 252
Inscription : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Portée des variables

Message par lmet »

Bonsoir,

Dans les scripts lua on voit souvent l'utilisation du mot-clé "local" ie: local a = "toto" pour limiter la portée de la variable mais si l'on déclare la variable comme étant globale ie: a = "toto" on s'aperçoit qu'à l'appel suivant du script la variable "a" vaut "nil"

Si l'on souhaite que la variable soit globale, faut-il obligatoirement passer par :

commandArray['Variable:a']= "On"
pour pouvoir la récupérer :
if ( uservariables["a"] == "On" ) then ... par exemple ?

Si c'est le cas alors je ne vois pas l'utilité de déclarer ses variables comme étant locales !

D'avance merci pour vos réponses car cela me chagrine un peu :(
Domoticz : V4.10717
Zigate : V4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Portée des variables

Message par vil1driver »

Salut,

Je ne suis pas expert mais de ce que j'ai compris.
'portée' ne signifie pas persistance.

Si par exemple tu déclares une variable local au sein d'un IF
Alors elle vaudra nil en dehors,
Il faudra soit l'avoir déclaré avant soit qu'elle soit globale.

Si dans le script tu appelles (comme je le fais avec modules.lua) un autre fichier, les variables passeront de l'un à l'autre que si elles sont globales..

L'intérêt est au niveau de l'usage de ressources, une question de performance il me semble..

Maintenant c'est expliqué plus en détail par ci par là
https://www.google.fr/search?q=lua+local+vs+global
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
lmet
Messages : 252
Inscription : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Re: Portée des variables

Message par lmet »

Bonjour,

Merci vil1driver pour tes explications lua fonctionne un peu différemment que d'autres langages.

Je vais retenir que le mot clé "local" ne s'applique qu'à l'intérieur d'un bloc de type "if ... end" "do ... end" "function ... end" ...
A l'extérieur de ces blocs la variable reste globale même si le mot clé "local" est appliqué.

Ce n'est pas forcement logique, il faut juste s'habituer ou changer de langage mais là je chipote ;)
Domoticz : V4.10717
Zigate : V4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Portée des variables

Message par vil1driver »

Non, local = local

Mais local peut être restreint (le script, une fonction, un bloc IF..) tout dépend du moment où la déclaration est faite.

Dans 99% des cas il est préférable de les définir ainsi.
C'est une bonne pratique que personnellement j'essaie de respecter tant que je le peux.

Maintenant j'ai découvert lua en même temps que domoticz alors il y a bien plus expert sur le sujet, certains articles sur la toile sauront sûrement mieux t'expliquer les choses
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
lmet
Messages : 252
Inscription : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Re: Portée des variables

Message par lmet »

Je dois mal m'exprimer ...

Code : Tout sélectionner

local a = 1

if a == 1 then
    print ("valeur de a " .. tostring (a)) -- en toute logique a devrait valoir 'nil' or a vaut 1
    local b = 3
end
-- là c'est bon a vaut 1 et b vaut bien "nil'  
print ("valeur a et b : " .. tostring (a) .. " " .. tostring (b))
Domoticz : V4.10717
Zigate : V4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique
cyberbob
Messages : 511
Inscription : 28 nov. 2016, 19:43
Localisation : Belgique

Re: Portée des variables

Message par cyberbob »

Je me trompe peut être mais il me semble que dans cet exemple,
la variable "a" est déclarée pour tout le script, donc y compris dans le if/end
la variable "b" est uniquement déclarée entre le if et le end, et non en dehors du if/end.
Domoticz Stable V4.9700 sur Synology DSM 6.2 / 2 x RFlink V48.4 - 433.92MHz(Dio/Chacon) & 433.42MHz(RTS) / Script en LUA & Blocky
lmet
Messages : 252
Inscription : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Re: Portée des variables

Message par lmet »

Bonsoir,
cyberbob a écrit :Je me trompe peut être mais il me semble que dans cet exemple,
la variable "a" est déclarée pour tout le script, donc y compris dans le if/end
la variable "b" est uniquement déclarée entre le if et le end, et non en dehors du if/end.
C'est un peu ce que j'essaie de démontrer la variable "a" a beau être déclarée avec le mot clé "local" sa portée est globale CQFD
Domoticz : V4.10717
Zigate : V4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique
Répondre