Je me suis inscrit à l’intense bootcamp de programmation informatique, la Maker Academy, le mois prochain. Pour prendre de l’avance, j’ai pensé que je travaillerais sur le livre Learn Ruby the Hard Way de Zed Shaw.

L’exercice 25 semble tester mes compétences en résolution de problèmes, alors j’ai pensé écrire un post documentant comment j’ai travaillé puis corrigé mes messages d’erreur. Ce post est destiné aux débutants dans le monde de la programmation car j’imagine que ce sont des choses très basiques que je me trompe.

C’était ma première tentative d’écrire le script de l’exercice 25 dans mon éditeur :

Quand je l’ai exécuté dans le terminal, j’ai obtenu le message d’erreur suivant:

ex25.rb:2:in `<main>': undefined local variable or method `ex25' for main:Object (NameError)

La première chose que j’ai faite a été de googler le message d’erreur.

Solving the Error Message with Google

J’ai trouvé une réponse sur Stackoverflow.

Il m’a dit que je tapais accidentellement Alt + Space sur mon Mac, créant ainsi une espace insécable. Ceci est considéré par Ruby comme faisant partie d’un nom de variable par opposition à l’espace blanc qu’il était censé être.

Il donnait deux solutions à ce problème :

1. Remapper Alt + Espace à l’espace pour empêcher cette faute de frappe de se reproduire.

2. Mettre en évidence les caractères invisibles dans l’éditeur de texte pour réaliser immédiatement les fautes de frappe.

La préférence semblait être pour la solution 2, alors j’ai pensé que j’essaierais d’abord de cette façon. Elle semblait la plus simple et la plus rapide à corriger. Je voulais exclure la question du prêt-à-porter de mon code cassé.

Mettre en évidence les caractères invisibles dans mon éditeur de texte – Partie 1

Puis j’ai cherché sur Google comment mettre en évidence les caractères invisibles avec mon éditeur de texte, Sublime Text editor 2.

Il s’avère que c’est censé être une fonctionnalité par défaut de mon éditeur de texte.

Chaque fois que je surligne un texte, je suis censé pouvoir voir des petits points blancs comme l’image ci-dessous (regardez bien, ils sont là dans les espaces vides):

J’ai donc surligné le texte et rien ne s’est passé :

J’ai décidé de laisser le problème des espaces insécables ici pour le moment et d’essayer de résoudre mon message d’erreur d’une manière plus simple. Je suis relativement nouveau dans le codage donc la solution suivante pour trouver des espaces ‘non cassants’ ; fixer les préférences ou les affectations de touches par défaut dans l’éditeur Sublime Text, ne semblait pas être le moyen le plus facile de résoudre mon problème.

Googler l’exercice lui-même

La chose suivante que j’ai faite était de googler ‘Ex25 learn Ruby the hard way’ pour voir si quelqu’un d’autre avait les mêmes problèmes que moi. J’ai trouvé un blog avec l’exercice tapé. J’ai comparé nos fichiers mot à mot sur mon écran.

Je n’ai pas pu VOIR de différence entre nos fichiers (ce qui indique que les espaces insécables cachés peuvent être la cause de mon erreur).

Mais j’avais besoin d’écarter l’idée qu’il y avait une faute de frappe que je ne pouvais pas repérer quelque part, alors j’ai tapé à nouveau le fichier entier. Figurant que c’était un moyen plus rapide d’arriver à la solution.

Mon deuxième fichier a fonctionné lorsque je l’ai exécuté dans le terminal. Aucun message d’erreur.

Voici le deuxième fichier:

J’étais intrigué de savoir où je m’étais encore trompé avec le premier fichier, alors je les ai comparés ligne par ligne.

Comparer le script qui fonctionne à celui qui a un message d’erreur

Je les ai comparés sur mon écran et j’ai remarqué deux différences que j’ai corrigées une par une.

1. Lorsque les fonctions antérieures étaient appelées dans des fonctions ultérieures, par exemple

def ex25.print_first_and_last(sentence)
words = ex25.break_word .. etc

La fonction ex25.break_word semblait ne pas avoir été reconnue dans le script d’erreur (celui de droite) alors que l’Ex25. apparaissait en bleu dans l’autre script (à gauche).

La raison la plus évidente que j’ai pu trouver était que le ‘e’ n’était pas capitalisé. J’ai donc changé tous les Ex25 dans le script cassé par un e majuscule.

J’ai exécuté le script mais j’ai toujours eu le même message d’erreur:

ex25.rb:2:in `<main>': undefined local variable or method `ex25' for main:Object (NameError)

2. La prochaine correction facile que j’ai remarquée était que le nom du fichier et le nom de la fonction dans le script cassé étaient les mêmes mais dans mon nouveau script, j’avais nommé le fichier EX25b.rb.

Peut-être que c’était cette différence de nommage qui était responsable de l’erreur ?

Nope ..

ex25.rb:2:in `<main>': undefined local variable or method `ex25' for main:Object (NameError)

Si j’avais lu l’intégralité de l’exercice dans Learning Ruby the Hard Way, j’aurais vu que ce n’était pas la réponse:

« Le module Ex25 n’a pas besoin d’être dans un fichier nommé ex25.rb. Essayez de le mettre dans un nouveau fichier avec un nom aléatoire puis importez ce fichier et voyez comment vous avez toujours Ex25 disponible. »

J’ai donc décidé de revenir à la première solution, l’espace insécable car j’avais maintenant épuisé les options faciles et je ne pouvais pas, pour ma vie, voir une différence entre l’erreur ou le script correct.

Mettre en évidence les caractères invisibles dans mon éditeur de texte – Partie 2

J’ai lu comment faire cela ici.

1. Ouvrez les ‘préférences’ dans l’éditeur de texte Sublime & sélectionnez ‘liaisons de touches’.

2. Insérez dans la partie gauche, l’onglet ‘utilisateur’ le code suivant :

{
"keys": ,
"command": "insert_snippet",
"args": {"contents": " "}
}

3. J’ai sauvegardé puis rouvert le fichier original (cassé 🙁 )).

Sure enough there was the accidental Alt and space bar non-breaking space:

HALLELUJAH … Je pensais… J’ai enfin réparé mon vieux script…….

Je l’ai relancé et j’ai TOUJOURS eu le même message d’erreur !

Voici où j’aurais probablement dû penser :

« J’ai été correct une fois et j’ai réussi à travailler sur l’exercice et à le terminer. Je vais juste l’appeler un jour et ne pas me soucier du fichier qui renvoie un message d’erreur ».

Mais je suis trop curieux / têtu pour me contenter de laisser l’erreur planer sur mon premier script.

J’ai lancé irb dans le terminal.

J’ai relancé le fichier que j’avais obtenu correctement & le fichier avec le message d’erreur:

J’ai essayé de trouver quelle était la différence entre les deux fichiers.

Peut-être était-ce les répertoires dans lesquels ils étaient enregistrés ?

Je vérifie et bien sûr ils étaient enregistrés dans des répertoires différents.

J’ai donc enregistré le fichier d’erreur dans le même répertoire que le fichier qui fonctionnait….. TOUJOURS le message d’erreur !

Je ne voyais aucune autre différence alors j’ai ….

Copié et collé le texte du fichier de travail dans le fichier d’erreur.

Alors quelque chose de terrible s’est produit !

Les DEUX fichiers ont cessé de fonctionner !!!!.

Le même message d’erreur est apparu pour le premier fichier et maintenant le fichier de travail retournait ‘false’ quand je le ‘demandais’ avec irb:

Cause possible de ce problème:

Trop de fichiers avec le même nom ou un nom similaire dans le même répertoire ?

J’ai supprimé tous les fichiers sauf un… Et comme par magie…

Cela a marché !!!

J’ai exécuté le script de travail pour Ex25 dans le terminal et suivi les instructions sur la façon d’utiliser irb pour appeler ses fonctions.

Voici mes résultats et mon explication de ce qui se passe :

Le script correct pour Ex25

Exécution du script en ligne de commande. ‘irb’

J’ai étiqueté les points où j’ai dû réfléchir un peu au fonctionnement. Voici mon explication:

1. Imprime ‘wait’ parce que la fonction agit sur le tableau ‘words’ qui n’est pas trié. Le tableau trié s’appelle ‘sorted_words’.

2. Le tableau ‘Words’ a eu la première et la dernière (‘all’ et ‘wait’) valeurs décalées dans la fonction print.

3. Appel sur le tableau ‘sorted_words’, pas le tableau ‘words’ qui a les valeurs manquantes. Par conséquent, ‘all’ est toujours dans le tableau.

4….Semble manquer à l’image … J’ai donc clairement jugé qu’il n’était pas pertinent alors donc je vais refaire la même chose maintenant..

5. J’utilise la variable originale ‘phrase’ et je la passe dans la fonction. Elle casse cette variable « phrase » en un tableau chaque fois qu’elle rencontre un espace. Puis en utilisant la fonction Ex25.sort_words pour trier ce tableau de mots.

6. Il prend la variable originale ‘phrase’, la casse en un tableau de mots puis imprime la première et la dernière valeur de ce tableau.

Nous sommes donc arrivés à la fin de ma lutte avec l’exercice 25 de Learn Ruby the Hard way. J’espère que vous avez apprécié et trouvé utile ma résolution de problèmes higgledy piggldy qui m’a finalement permis de battre les messages d’erreur donnés en exécutant mon script. S’il vous plaît ne me contacter si vous êtes par un mince hasard lire ce & besoin d’aide à la compréhension.

Enjoy, 🙂

Ce post a été initialement publié ICI.

Articles

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.