Me he inscrito en el intenso campamento de programación informática, la Maker Academy, el próximo mes. Para conseguir una ventaja pensé que iba a trabajar a través de Zed Shaw’s Learn Ruby the Hard Way book.

El ejercicio 25 parece estar poniendo a prueba mis habilidades de resolución de problemas, así que pensé que iba a escribir un post documentando cómo trabajé y luego arreglé mis mensajes de error. Este post está dirigido a los novatos en el mundo de la programación ya que me imagino que son cosas muy básicas las que estoy haciendo mal.

Este fue mi primer intento de escribir el script del ejercicio 25 en mi editor:

Cuando ejecuté esto en la terminal obtuve el siguiente mensaje de error:

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

Lo primero que hice fue buscar en Google el mensaje de error.

Resolver el mensaje de error con Google

Encontré una respuesta en Stackoverflow.

Me dijo que estaba escribiendo accidentalmente Alt + Espacio en mi Mac, por lo tanto, la creación de espacio sin romper. Esto es considerado por Ruby como parte de un nombre de variable en lugar del espacio en blanco que se pretendía ser.

Dio dos soluciones a este problema:

1. Reasignar Alt + Espacio a espacio para evitar que esta errata vuelva a ocurrir.

2. Resaltar los caracteres invisibles en el editor de texto para darse cuenta inmediatamente de las erratas.

La preferencia parecía ser la solución 2, así que pensé en probar esta forma primero. Parecía la más sencilla y rápida de solucionar. Quería descartar la cuestión de off-the-shelf a mi código roto.

Resaltar caracteres invisibles en mi editor de texto – Parte 1

Luego busqué en Google cómo resaltar caracteres invisibles con mi editor de texto, Sublime Text editor 2.

Resulta que esto se supone que es una característica por defecto de mi editor de texto.

Cada vez que resalto un texto se supone que puedo ver pequeños puntos blancos como los de la imagen de abajo (mira de cerca que están ahí en los espacios vacíos):

Así que resalté el texto y no pasó nada:

Decidí aparcar el problema de los espacios de ‘no ruptura’ aquí por ahora y tratar de resolver mi mensaje de error de una manera más fácil. Soy relativamente nuevo en la codificación, por lo que la siguiente solución para encontrar espacios ‘sin romper’; arreglar las preferencias o asignaciones de teclas por defecto en el editor Sublime Text, no parecía la forma más fácil de resolver mi problema.

Googleando el ejercicio en sí

Lo siguiente que hice fue googlear ‘Ex25 learn Ruby the hard way’ para ver si alguien más estaba teniendo los mismos problemas que yo. Encontré un blog con el ejercicio escrito. Comparé nuestros archivos palabra por palabra en mi pantalla.

No pude VER ninguna diferencia entre nuestros archivos (lo que indica que los espacios ocultos sin romper pueden ser la causa de mi error).

Sin embargo, necesitaba descartar la idea de que había un error tipográfico que no pude detectar en alguna parte, así que escribí el archivo completo de nuevo. Pensando que era una forma más rápida de llegar a la solución.

Mi segundo archivo funcionó cuando lo ejecuté en el terminal. No hay mensaje de error.

Aquí está el segundo archivo:

Estaba intrigado por saber dónde me había equivocado con el primer archivo, así que los comparé línea por línea.

Comparando el script que funcionaba con el que tenía un mensaje de error

Los comparé en mi pantalla y noté dos diferencias que arreglé de una en una.

1. Cuando las funciones anteriores eran llamadas en las posteriores, por ejemplo.

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

La función ex25.break_word parecía no haber sido reconocida en el script de error (el de la derecha) mientras que el Ex25. aparecía azul en el otro script (el de la izquierda).

La razón más obvia que se me ocurrió fue que la ‘e’ no estaba en mayúsculas. Así que cambié todas las Ex25 del script roto por una e mayúscula.

Ejecuté el script pero seguía apareciendo el mismo mensaje de error:

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

2. El siguiente arreglo fácil que noté fue que el nombre del archivo y el nombre de la función en el script roto eran los mismos pero en mi nuevo script había nombrado el archivo EX25b.rb.

¿Puede que esta diferencia de nombre fuera la responsable del error?

No…

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

Si hubiera leído todo el ejercicio en Learning Ruby the Hard Way habría visto que esta no era la respuesta:

«El módulo Ex25 no tiene que estar en un archivo llamado ex25.rb. Pruebe a ponerlo en un nuevo archivo con un nombre aleatorio y luego importe ese archivo y vea cómo sigue teniendo disponible Ex25.»

Así que decidí volver a la primera solución, el espacio sin romper, ya que había agotado las opciones fáciles y no podía, por mi vida, ver ninguna diferencia entre el error y el script correcto.

Resaltar caracteres invisibles en mi editor de texto- Parte 2

Leí cómo hacerlo aquí.

1. Abrir las ‘preferencias’ dentro del editor de texto Sublime & seleccionar ‘key bindings’.

2. Insertar en el lado izquierdo, en la pestaña ‘usuario’ el siguiente código:

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

3. Guardado a continuación, volver a abrir el archivo original (roto 🙁 ).

Seguro que había el espacio accidental Alt y barra espaciadora no romper:

HALLELUJAH .. Pensé .. Por fin he arreglado mi viejo script…….

¡Lo he vuelto a ejecutar y TODAVÍA tenía el mismo mensaje de error!

Aquí es donde probablemente debería haber pensado:

«Lo he hecho bien una vez y he conseguido trabajar en el ejercicio y completarlo. Lo daré por terminado y no me preocuparé por el archivo que devuelve un mensaje de error».

Pero soy demasiado curioso / obstinado como para conformarme con dejar que el error se cierna sobre mi primer script.

Ejecuté irb en la terminal.

Ejecuté de nuevo el archivo que tenía correcto & el archivo con el mensaje de error:

Intenté averiguar cuál era la diferencia entre los dos archivos.

¿Quizás eran los directorios en los que estaban guardados?

Lo comprobé y efectivamente estaban guardados en directorios diferentes.

Así que guardé el archivo de error en el mismo directorio que el archivo que funcionaba….

Todavía el mensaje de error!

No pude ver ninguna otra diferencia así que ….

Copié y pegué el texto del archivo que funcionaba en el archivo de error.

Entonces sucedió algo terrible!

Ambos archivos dejaron de funcionar!!!!

Apareció el mismo mensaje de error para el primer archivo y ahora el archivo de trabajo devolvía ‘false’ cuando lo ‘requería’ con irb:

¿Posible causa de este problema:

Demasiados archivos con el mismo o similar nombre en el mismo directorio?

Borré todos menos uno… Y como por arte de magia…

¡Funcionó!!!

Ejecuté el script de trabajo para Ex25 en el terminal y seguí las instrucciones de cómo usar irb para llamar sus funciones.

Aquí están mis resultados y mi explicación de lo que ocurre:

El script correcto para Ex25

Ejecutando el script en línea de comandos ‘irb’

He etiquetado los puntos en los que he tenido que pensar un poco cómo funcionaba. Esta es mi explicación:

1. Imprime ‘wait’ porque la función está actuando sobre el array ‘words’ que no está ordenado. El array ordenado se llama ‘sorted_words’.

2. El array ‘Words’ tiene los valores primero y último («all» y ‘wait’ ) desplazados en la función de impresión.

3. Llama al array ‘sorted_words’, no al array ‘words’ que tiene los valores que faltan. Por lo tanto ‘all’ sigue en el array.

4….Parece que falta en la imagen… Así que claramente lo consideré irrelevante entonces por lo tanto haré lo mismo ahora..

5. Usando la variable original ‘sentence’ y pasando esto a través de la función. Está rompiendo esta variable frase en una matriz cada vez que encuentra un espacio. Luego usando la función Ex25.sort_words para ordenar este array de palabras.

6. Está tomando la variable original ‘sentence’, rompiéndola en un array de palabras y luego imprimiendo el primer y último valor de ese array.

Así hemos llegado al final de mi lucha con el ejercicio 25 de Learn Ruby the Hard way. Espero que hayáis disfrutado y encontrado útil mi solución de problemas, que finalmente me ha permitido superar los mensajes de error dados al ejecutar mi script. Por favor, póngase en contacto conmigo si por casualidad está leyendo esto & necesita cualquier ayuda para entenderlo.

Disfrute, 🙂

Este post fue publicado originalmente AQUÍ.

Articles

Deja una respuesta

Tu dirección de correo electrónico no será publicada.