Point vs deux-points
Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 4 sur 70.
Maintenant que vous connaissez les syntaxes avec point et 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 d'or 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 lorsque 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 aucune table n'est passée
game.addPoints(10) -- Erreur ! self vaut maintenant 10, pas la tableLorsque vous appelez game.addPoints(10), Lua ne transmet pas automatiquement game. La valeur 10 devient self, provoquant un comportement inattendu ou des erreurs.
L'erreur inverse pose également des problèmes :
function game.reset(self)
self.score = 0
end
-- ERREUR : l'appel avec deux-points passe game deux fois
game:reset() -- self reçoit game, mais un argument nil supplémentaire est également attenduBien que ce cas particulier puisse fonctionner, il 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.
Défi
FacileCréez une table nommée player avec un champ score initialisé à 0.
Ajoutez deux fonctions à la table :
player.setScore(self, value)- définie avec la syntaxe avec point et un paramètreselfexplicite. Définitself.scoreà la valeur donnée.player:addBonus(amount)- définie avec la syntaxe avec deux-points. Ajouteamountàself.score.
Vous recevrez deux entrées :
- Une valeur de score initiale
- Un montant de bonus à ajouter
Effectuez les étapes suivantes :
- Appelez
setScoreen utilisant la syntaxe avec point (en passant la table comme premier argument) pour définir le score initial - Appelez
addBonusen utilisant la syntaxe avec deux-points pour ajouter le bonus - 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.
Aide-mémoire
Lors de la définition et de l'appel de méthodes en Lua, la syntaxe doit correspondre :
- Si vous définissez avec deux-points (
:), appelez avec deux-points - Si vous définissez avec un point (
.) et unselfexplicite, appelez avec un point et passez la table
Utilisation incorrecte - appel avec un point lors d'une définition avec deux-points :
function game:addPoints(points)
self.score = self.score + points
end
game.addPoints(10) -- Error! self becomes 10, not the tableUtilisation incorrecte - appel avec deux-points lors d'une définition avec un point :
function game.reset(self)
self.score = 0
end
game:reset() -- Confusing: passes game automatically but may cause issuesUtilisation correcte - syntaxe correspondante :
-- Define with colon, call with colon
function game:addPoints(points)
self.score = self.score + points
end
game:addPoints(10)
-- Define with dot, call with dot
function game.reset(self)
self.score = 0
end
game.reset(game)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éer une table nommée 'player' avec un champ 'score' initialisé à 0
-- 2. Ajouter player.setScore(self, value) en utilisant la syntaxe avec point avec un self explicite
-- 3. Ajouter player:addBonus(amount) en utilisant la syntaxe avec deux-points
-- 4. Appeler setScore en utilisant la syntaxe avec point (en passant la table comme premier argument)
-- 5. Appeler addBonus en utilisant la syntaxe avec deux-points
-- Afficher le score final
print(player.score)Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Object Oriented Programming
1Le concept de « self »
Tables avec fonctions« self » expliciteLa syntaxe avec deux-pointsPoint vs deux-pointsRécapitulatif - Point mobile4Projet : Banque numérique
Configuration du projetMéthode de dépôt7Polymorphisme et Redéfinition
Redéfinition de méthodesAppeler des méthodes parentesDuck TypingInterface communeVérification du typeRécapitulatif - Rôles des employés10Projet : Gestionnaire de formes
Configuration du projetClasse Rectangle2Modèle de prototype de classe
Le concept de prototypeLiaison avec __indexLe constructeur :new()Initialisation des attributsInstances indépendantesRécapitulatif - Usine de voitures5Surcharge d'opérateurs en POO
Additionner des objetsSoustraire des objetsConcaténer des objetsComparer des objets (<, >)Récapitulatif - Calculs de portefeuille8Encapsulation
Conventions de nommageClosures pour la confidentialitéAccès via les ClosuresTables en lecture seuleLogique de validationRécapitulatif - Coffre-fort sécurisé11Patrons de conception (Lite)
Fonctions FactoryTable SingletonPatron IteratorObserver (Écouteur)Récapitulatif - Logger Factory3État et comportement des objets
Variables d'instanceMéthodes GetterMéthodes SetterPropriétés calculéesFormatage de chaînesVérifications d'égalitéRécapitulatif - Note de l'étudiant6Bases de l'héritage
Mise en place de l'héritageHériter des méthodesÉtendre le constructeurAjouter des méthodes enfantsPartagé vs UniqueRécapitulatif - Hiérarchie des formes