Les fonctions

Les fonctions sont très importantes car elles permettent de structurer et de simplifier le code. Voici un exemple simple :

1
2
3
4
5
6
7
8
function bonjour()
  print("Bonjour")
end

bonjour()

-- output :
--  Bonjour

Passage de paramètres

1
2
3
4
5
6
7
8
function plus(a, b)
  print(a + b)
end

plus(5, 5)

-- output :
--  10

Valeur de retour

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function plus(a, b)
  return a + b
end

z = plus(5, 5)
print(z)
-- On aurait aussi pu écrire directement : print(plus(5, 5))

-- output :
--  10

Plusieurs valeurs de retour

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
function vals()
  return 3, 7
end

function main()
  a, b = vals()
  print(a)
  print(b)

  -- Si nous ne voulons pas utiliser la première valeur, on peut utiliser _
  _, c = vals()
  print(c)
end

main()

-- output :
--  3
--  7
--  7

return vs break

Lorsque nous avons vu le mot-clé break, je vous avais dit qu’il existait une autre solution pour interrompre une boucle. La voici :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
-- Avec break
function maFunc()
  for i = 0, 10 do
    if i == 5 then
      break
    end
    print(i)
  end
  print("Fin")
end

maFunc()

-- output :
--  0
--  1
--  2
--  3
--  4
--  Fin
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
-- Avec return
function otherFunc()
  for i = 0, 10 do
    if i == 5 then
      return
    end
    print(i)
  end
  print("Fin")
end

otherFunc()

-- output :
--  0
--  1
--  2
--  3
--  4

Vous remarquerez que print("Fin") n’est pas exécuté dans le second cas. Le mot-clé return permet de quitter complètement la fonction, ce qui rappelle le comportement de break, mais à l’échelle de la fonction.

Appels de fonctions imbriquées

Une fonction peut bien sûr appeler une autre fonction.

Appels alternatifs

Lua permet deux syntaxes particulières pour appeler une fonction :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
local function test(str)
  print(str)
end

test "5"
test{ "4" }
test{ "4", "5" }

-- output :
--  5
--  table: 0x16aad60
--  table: 0x16abad0

Les deux derniers appels transmettent des tables en argument.