Quand une fonction est incluse dans une autre fonction, elle a pleinement accès aux variables locales de la fonction englobante, cette fonctionnalité est appelée portée lexicale.
Commençons par un exemple simple.
Supposez que vous ayez une liste de noms d'élèves et un tableau qui associe ces noms à des notes.
Vous voulez trier la liste des noms, selon leur note (dans un ordre décroissant).
Vous pouvez effectuer cette tâche comme suit:
-- Pour exécuter cet exemple, rajouter le code wxWidgets N°3 noms = {"Peter", "Paul", "Mary"} notes = {Mary = 10, Paul = 7, Peter = 8} -- Affichage des noms avant le trie textCtrl:AppendText("Affichage des noms avant le tri.\n") for k, v in ipairs(noms) do Affiche(k, v) end -- Le tri table.sort(noms, function(n1, n2) return notes[n1] > notes[n2] -- compare les notes end) -- Affichage des noms après le tri textCtrl:AppendText("\nAffichage des noms après le trie.\n") for k, v in ipairs(noms) do Affiche(k, v) end
Maintenant, si vous voulez créer une fonction qui remplisse la même tâche...
noms = {"Peter", "Paul", "Mary"} notes = {Mary = 10, Paul = 7, Peter = 8} function Tri_Par_Note(noms, notes) table.sort(nom, function(n1, n2) return notes[n1] > notes[n2] -- compare les notes end) end
function newCounter() local i = 0 return function() -- fonction anonyme i = i + 1 return i end end h2 = newCounter() print(h2()) --> 1 print(h2()) --> 2
c2 = newCounter() (c2()) --> 1 (h2()) --> 3 (c2()) --> 2
oldSin = math.sin math.sin = function(x) return oldSin(x * math.pi/180) end
do local oldSin = math.sin local k = math.pi/180 math.sin = function(x) return oldSin(x * k) end end
do local oldOpen = io.open io.open = function(filname, mode) if access_OK(filename, mode) then return oldOpen(filename, mode) else return nil -- accès refusé end end end
Après cette redéfinition, il n'y a plus aucun moyen d'appeler la fonction open normalement.
La fonction open est maintenant une fonction sécurisée.