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 vous connaissez à la fois la syntaxe avec point et celle avec deux-points, il est crucial de comprendre quand utiliser chacune d'elles — et ce qui se passe lorsque vous les mélangez de manière incorrecte.

La règle clé est simple : la façon dont vous définissez une fonction doit correspondre à la façon dont vous l'appelez. Si vous définissez avec deux-points, appelez avec deux-points. Si vous définissez avec un point et un self explicite, appelez avec un point et passez la table.

Voici ce qui se passe quand vous ne les faites pas correspondre :

local game = { score = 0 }

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

-- ERREUR : appel avec un point, mais aucun tableau n'est passé
game.addPoints(10)  -- Erreur ! self est maintenant 10, pas le tableau

Lorsque vous appelez game.addPoints(10), Lua ne transmet pas automatiquement game. La valeur 10 devient self, ce qui provoque un comportement inattendu ou des erreurs.

Le sens inverse est plus indulgent :

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

-- Appel avec les deux-points : game:reset() est identique à game.reset(game)
game:reset()  -- self reçoit correctement game, donc cela fonctionne

Bien que ce cas particulier puisse fonctionner, cela crée de la confusion et peut casser des fonctions qui attendent des arguments spécifiques. L'approche la plus sûre est de 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 quand ce n'est pas le cas.

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 par point et un paramètre self explicite. Définit self.score à la valeur donnée.
  2. player:addBonus(amount) - définie avec la syntaxe par 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 par point (en passant la table comme premier argument) pour définir le score initial
  2. Appelez addBonus en utilisant la syntaxe par deux-points pour ajouter le bonus
  3. Affichez la valeur finale de player.score

Rappel : faites correspondre la façon dont vous appelez chaque fonction à la façon 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 avec point avec un self explicite
-- 3. Ajoutez player:addBonus(amount) en utilisant la syntaxe avec deux-points
-- 4. Appelez setScore en utilisant la syntaxe avec point (en passant la table comme premier argument)
-- 5. Appelez addBonus en utilisant la syntaxe avec 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