Menu
Coddy logo textTech

Point vs deux-points

Fait partie de la section Programmation orientée objet du Journey Lua de Coddy. Leçon 4 sur 70.

Maintenant que tu connais à la fois la syntaxe avec un point et celle avec un deux-points, il est essentiel de comprendre quand utiliser chacune et ce qui se passe lorsque tu les mélanges incorrectement.

La règle essentielle est simple : la manière dont tu définis une fonction doit correspondre à la manière dont tu l’appelles. Si tu la définis avec deux-points, appelle-la avec deux-points. Si tu la définis avec un point et un self explicite, appelle-la avec un point et transmets la table.

Voici ce qui se passe lorsque vous les faites correspondre incorrectement :

local game = { score = 0 }

function game:addPoints(points)
    self.score = self.score + points
end

-- WRONG: appel avec un point, mais aucune table n'est passée
game.addPoints(10)  -- Erreur ! self est maintenant 10, pas la table

Lorsque tu appelles game.addPoints(10), Lua ne transmet pas automatiquement game. La valeur 10 devient self, ce qui entraîne un comportement inattendu ou des erreurs.

La direction inverse est plus indulgente :

function game.reset(self)
    self.score = 0
end

-- Appel avec deux-points : game:reset() est la même chose que game.reset(game)
game:reset()  -- self reçoit correctement game, donc cela fonctionne

Bien que ce cas particulier puisse fonctionner, il crée de la confusion et peut casser les fonctions qui attendent des arguments spécifiques. L'approche la plus sûre consiste à rester cohérent : utilisez les deux-points pour la définition et l'appel lorsque la fonction a besoin de self, et utilisez le point lorsqu'elle n'en a pas besoin.

challenge icon

Défi

Facile

Créez une table nommée player avec un champ score initialisé à 0.

Ajoutez deux fonctions à la table :

  1. player.setScore(self, value) - définie avec la syntaxe pointée et un paramètre self explicite. Définit self.score sur la valeur donnée.
  2. player:addBonus(amount) - définie avec la syntaxe à deux-points. Ajoute amount à self.score.

Vous recevrez deux entrées :

  1. Une valeur de score initiale
  2. Un montant de bonus à ajouter

Effectuez les étapes suivantes :

  1. Appelez setScore en utilisant la syntaxe pointée (en passant la table comme premier argument) pour définir le score initial
  2. Appelez addBonus en utilisant la syntaxe à deux-points pour ajouter le bonus
  3. Affichez la valeur finale de player.score

N'oubliez pas : faites correspondre la manière dont vous appelez chaque fonction à la manière dont elle a été définie.

Essayez vous-même

-- Lire l'entrée
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())

-- TODO: Écrivez votre code ci-dessous
-- 1. Créez une table nommée 'player' avec un champ 'score' initialisé à 0
-- 2. Ajoutez player.setScore(self, value) en utilisant la syntaxe point avec self explicite
-- 3. Ajoutez player:addBonus(amount) en utilisant la syntaxe deux-points
-- 4. Appelez setScore en utilisant la syntaxe point (en passant la table comme premier argument)
-- 5. Appelez addBonus en utilisant la syntaxe deux-points


-- Afficher le score final
print(player.score)
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Lua en ligne