Fichiers multiples et porté des variables avec love2d

Fichiers multiples

Avec plusieurs fichiers, notre code sera mieux organisé et plus facile à lire. Créez en un et appelez le example.lua. Prenez soin qu’il soit dans le même répertoire que main.lua.

Dans le fichier, créons une variable. Nous mettrons ––! file: nom du fichier tout en haut pour préciser dans lequel mettre le code :

1
2
--! file: example.lua
test = 20

Maintenant dans main.lua, mettez print(test). Quand vous allez exécuter le jeu, vous verrez que test vaut nil. C’est parce que nous n’avons pas chargé le fichier en premier. Nous devons le faire avec require en passant le nom du fichier comme chaîne de caractères en premier argument :

1
2
3
4
--! file: main.lua
-- Laissez le .lua
require("example")
print(test)

Nous n’avons pas besoin d’ajouter l’extension “.lua” au nom du fichier car Lua le fait pour nous.

Nous pouvons mettre le fichier dans un sous répertoire mais dans ce cas, assurez-vous de bien mettre tout le chemin :

1
2
-- Utilisez . au lieu de /
require(emplacement.du.fichier.exemple)

Maintenant, quand vous affichez la variable test après avoir chargé example.lua il devrait vous dire 20.

Dans ce cas c’est ce que nous appelons une variable globale. C’est une variable que nous pouvons utiliser partout dans notre projet. À l’opposé d’une variable globale nous avons la variable locale. Vous pouvez en créer une en écrivant local devant son nom :

1
2
--! file: example.lua
local test = 20

Exécutez le jeu pour voir que l’affichage de la variable test donne une nouvelle fois nil. C’est à cause de la portée des variables.

Porté des variables

Les variables locales ont une porté limitée. Dans le cas de test, la porté est limitée au fichier example.lua. Cela veut dire que test peut être utilisé partout dans le fichier mais pas dans d’autres fichiers.

Si nous souhaitons créer une variable locale dans un bloc comme une fonction, une condition if ou une boucle for alors elle sera une variable à porté limitée à celui-ci :

1
2
3
4
5
6
7
--! file: example.lua
if true then
  local test = 20
end

print(test)
-- Output: nil

test vaut nil car l’affichage est au delà de la porté de la variable.

Les paramètres d’une fonction sont comme des variables locales. Elles n’existent que dans la fonction.

Pour réellement comprendre comment le scope (la porté) fonctionne, regardez le code suivant:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
--! file: main.lua
test = 10
require("example")
print(test)
-- Output: 10

--! file: example.lua
local test = 20

function some_function(test)
  if true then
    local test = 40
    print(test)
    -- Output: 40
  end

  print(test)
  -- Output: 30
end

some_function(30)

print(test)
-- Output: 20

Si vous exécutez le jeu, il devrait vous écrire 40, 30, 20, 10. Regardons ce code étape par étape :

  1. Le premier affichage à l’intérieur de la condition if est 40.
  2. Après celui-ci, nous affichons test une nouvelle fois et il affiche 30 lequel est passé en argument à la fonction. Le paramètre test n’est pas affecté par la variable test à l’intérieur de la condition if. À l’intérieur de l’instruction if, la variable locale devient prioritaire sur le paramètre.
  3. En dehors de la fonction, nous affichons test. Cette fois, il vaut 20. La variable test créée au début du fichier example.lua n’est pas affectée par la variable à l’intérieur de la fonction.
  4. Dernièrement, nous affichons la variable test dans le fichier main.lua et elle vaut 10. La variable globale n’est pas affectée par la variable locale dans le fichier example.lua.

J’ai fait une représentation de la porté de chaque variable test pour que ça soit plus clair :

Représentation de la porté de chaque variable
Représentation de la porté de chaque variable

Quand une variable locale est créée, vous n’avez pas d’obligation de lui donner une valeur immédiatement :

1
2
local test
test = 20

Les valeurs de retour

Comme les fonctions, les fichiers peuvent renvoyer une valeur. Si nous mettons return 10 à la fin du fichier example.lua et qu’à l’intérieur du fichier main.lua nous faisons print(require(“example”)), cela nous affichera 10.

Résumé

Avec require nous pouvons charger d’autres fichiers lua. Quand nous créons une variable, nous pouvons l’utiliser dans tous le fichier. Par contre, si vous utilisez une variable locale, elle sera limitée à sa porté (scope). Les variables locales n’affectent pas les variables ayant le même nom en dehors de leur porté.