Contactez-nous

Erreur commune : oublier d'appeler `.new` pour créer une instance

Vous obtenez une erreur en essayant d'utiliser votre classe ? Découvrez pourquoi appeler une classe sans `.new` ne fonctionne pas en Ruby. Maîtriser ce point fondamental sur la création d'instances

Identifier le symptôme : l'erreur `NoMethodError`

Cette erreur vous dit que l'objet principal de votre programme (main:Object) ne connaît pas de méthode nommée Cat. C'est le premier indice : Ruby n'a pas compris que vous vouliez créer un objet.

Pourquoi cette erreur se produit-elle ? La classe est un plan, pas un objet

La raison de cette erreur est directement liée au concept de classe et d'instance. Le mot Cat dans votre code n'est pas une variable contenant un chat. C'est une constante qui contient la définition de la classe elle-même, c'est-à-dire le plan.

Lorsque vous écrivez Cat("Félix"), la syntaxe ressemble à un appel de méthode. Ruby interprète donc cela comme une tentative d'appeler une méthode nommée Cat, et comme cette méthode n'existe pas, il lève une erreur NoMethodError.

En d'autres termes, vous avez le plan de la maison (la classe Cat) et vous essayez de lui parler comme si c'était déjà une maison construite. Pour passer du plan à la maison, il faut une action explicite, un 'processus de construction'. En Ruby, ce processus est initié par la méthode .new.

La solution : utiliser explicitement la méthode `.new`

En exécutant ce code corrigé, le résultat est celui attendu :

Un chat nommé Félix est né !
#<Cat:0x000001a2e9b9d3f8 @name="Félix">

Le message confirme que initialize a été exécuté, et l'inspection de l'objet montre bien une instance de Cat avec sa propre variable @name. L'appel à .new est le pont indispensable entre le monde des définitions (classes) et le monde des objets concrets (instances).

Conseil d'expert : la distinction entre méthode de classe et méthode d'instance

Cette erreur est une excellente occasion d'introduire une nuance importante : la différence entre une méthode de classe et une méthode d'instance. .new est une méthode de classe. Vous l'appelez directement sur la classe (Cat.new) car son rôle est de fabriquer des objets de cette classe.

Plus tard, nous ajouterons des méthodes comme meow à notre classe Cat. Ces méthodes seront des méthodes d'instance, car elles représentent un comportement qu'un chat individuel peut effectuer (felix.meow). Vous ne pourriez pas appeler Cat.meow, car le plan lui-même ne peut pas miauler ; seul un chat réel le peut.

Garder cette distinction en tête vous aidera à comprendre sur quel 'objet' (la classe-plan ou l'instance-objet) une méthode doit être appelée, ce qui éliminera toute une catégorie d'erreurs potentielles.