Menu
CoddyTech

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 les syntaxes avec le point et les deux-points, voici quel est leur lien et ce qui ne va pas quand la table n’est pas transmise.

Les deux-points sont une forme abrégée. Définir function game:addPoints(points) revient à définir function game.addPoints(self, points), et appeler game:addPoints(10) revient à appeler game.addPoints(game, 10). Une méthode fonctionne tant que la table lui est transmise comme premier argument.

Voici ce qui se passe lorsque le tableau n'est pas transmis :

local game = { score = 0 }

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

-- ERREUR : appel avec un point, mais aucune table n’a été transmise
game.addPoints(10)  -- Erreur ! self vaut maintenant 10, et non la table

Lorsque tu appelles game.addPoints(10), Lua ne transmet pas automatiquement game. La valeur 10 devient self, et self.score échoue parce que 10 est un nombre, pas une table.

Une fonction définie avec un point et un self explicite fonctionne avec un appel utilisant deux-points, car les deux-points transmettent la table comme premier argument :

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

-- Appel avec deux-points : game:reset() équivaut à game.reset(game)
game:reset()  -- self reçoit bien game, donc cela fonctionne

Les deux définitions créent la même fonction ; le choix relève donc d’une convention : utilise les deux-points pour définir et appeler les fonctions qui utilisent self, et le point pour celles qui n’utilisent pas self. Ainsi, chaque appel indique si la table est transmise.

challenge icon

Défi

Facile

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

Ajoute deux fonctions à la table :

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

Tu recevras deux entrées :

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

Effectue les étapes suivantes :

  1. Appelle setScore avec la syntaxe avec un point (en passant la table comme premier argument) pour définir le score initial
  2. Appelle addBonus avec la syntaxe avec deux-points pour ajouter le bonus
  3. Affiche la valeur finale de player.score

N'oublie pas : la manière dont tu appelles chaque fonction doit correspondre à 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 avec un point et self explicite
-- 3. Ajoutez player:addBonus(amount) en utilisant la syntaxe avec deux-points
-- 4. Appelez setScore en utilisant la syntaxe avec un 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

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