Kun ajoin tämän terminaalissa, sain seuraavan virheilmoituksen:
ex25.rb:2:in `<main>': undefined local variable or method `ex25' for main:Object (NameError)
Ensimmäisenä googlasin virheilmoituksen.
Virheilmoituksen ratkaiseminen Googlella
Löysin vastauksen Stackoverflow’sta.
Se kertoi minulle, että kirjoitin vahingossa Alt + välilyönti Macissani, ja näin ollen loin ei-taukoavan välilyönnin. Ruby pitää tätä osana muuttujan nimeä sen sijaan, että se olisi tarkoitettu välilyönniksi.
Se antoi kaksi ratkaisua tähän ongelmaan:
1. Alt + välilyönnin muuttaminen välilyönniksi estää tämän kirjoitusvirheen toistumisen.
2. Näkymättömien merkkien korostaminen tekstieditorissa, jotta kirjoitusvirheet huomataan heti.
Editorin suosikki näytti olevan ratkaisu 2, joten ajattelin kokeilla tätä tapaa ensin. Se tuntui yksinkertaisimmalta ja nopeimmin korjattavalta. Halusin sulkea pois off-the-shelf-ongelman rikkinäiseen koodiini.
Näkymättömien merkkien korostaminen tekstieditorissani – Osa 1
Seuraavaksi googlasin, miten korostan näkymättömät merkit tekstieditorillani, Sublime Text editor 2:lla.
Kiinni kävi, että tämän pitäisi olla oletusarvoisesti tekstieditorini ominaisuus.
Joka kerta kun korostan tekstiä minun pitäisi nähdä pieniä valkoisia pisteitä kuten alla olevassa kuvassa (katso tarkkaan ne ovat siellä tyhjissä kohdissa):
Korostin siis tekstiä eikä mitään tapahtunut:
Päätin parkkeerata ’ei-taukoavien’ välilyöntien ongelman tähän toistaiseksi ja yrittää ratkaista virheilmoitukseni helpommalla tavalla. Olen suhteellisen uusi koodaamisessa, joten seuraava ratkaisu ’ei-taukoavien’ välilyöntien löytämiseksi; Sublime Text -editorin asetusten tai oletusnäppäinmääritysten korjaaminen ei tuntunut helpoimmalta tavalta ratkaista ongelmaani.
Googletin itse harjoituksen
Seuraavaksi googlasin ’Ex25 oppii Rubya vaikealla tavalla’ nähdäkseni, oliko kenelläkään muulla samoja ongelmia kuin minulla. Löysin blogin, jossa harjoitus oli kirjoitettu. Vertailin tiedostojamme sanasta sanaan näytölläni.
En nähnyt mitään eroa tiedostojemme välillä (mikä osoittaa, että piilotetut katkomattomat välilyönnit saattavat aiheuttaa virheeni).
Minun piti kuitenkin sulkea pois ajatus siitä, että jossakin oli kirjoitusvirhe, jota en voinut havaita, joten kirjoitin koko tiedoston uudelleen. Ajattelin, että tämä oli nopeampi tapa päästä ratkaisuun.
Toinen tiedostoni toimi, kun ajoin sen terminaalissa. Ei virheilmoitusta.
Tässä on toinen tiedosto:
Olin utelias siitä, missä menin pieleen ensimmäisessä tiedostossa vielä, joten vertasin niitä rivi riviltä.
Vertailin toimivaa skriptiä siihen, jossa oli virheilmoitus
Vertailin niitä ruudulla ja huomasin kaksi eroa, jotka korjasin yksi kerrallaan.
1. Kun aiempia funktioita kutsuttiin myöhemmissä esim.
def ex25.print_first_and_last(sentence) words = ex25.break_word .. etc
Ex25.break_word-funktio näytti siltä, että sitä ei oltu tunnistettu virheskriptissä (oikealla), kun taas Ex25. näytti siniseltä toisessa skriptissä (vasemmalla).
Yksiselitteisin syy, jonka pystyin keksimään, oli se, että ’e’ ei ollut kirjoitettu isolla. Niinpä muutin kaikki Ex25:t rikkinäisessä skriptissä isolla e:llä kirjoitetuiksi.
Ajoin skriptin, mutta sain edelleen saman virheilmoituksen:
ex25.rb:2:in `<main>': undefined local variable or method `ex25' for main:Object (NameError)
2. Seuraava helppo korjaus, jonka huomasin, oli se, että tiedoston nimi ja funktion nimi rikkinäisessä skriptissä olivat samat, mutta uudessa skriptissäni olin nimennyt tiedoston EX25b.rb.
Mahdollisesti tämä ero nimeämisessä aiheutti virheen?
Ei ..
ex25.rb:2:in `<main>': undefined local variable or method `ex25' for main:Object (NameError)
Jos olisin lukenut koko harjoituksen Learning Ruby the Hard Way -kirjassa, olisin nähnyt, että tämä ei ollut vastaus:
”Ex25-moduulin ei tarvitse olla tiedostossa nimeltä ex25.rb. Kokeile laittaa se uuteen tiedostoon satunnaisella nimellä ja tuo sitten tuo tiedosto ja katso, miten sinulla on edelleen Ex25 käytettävissä.”
Päädyin siis palaamaan ensimmäiseen ratkaisuun, ei-breaking spaceen, koska olin nyt käyttänyt kaikki helpot vaihtoehdot loppuun enkä nähnyt mitään eroa virheen ja oikean skriptin välillä.
Näkymättömien merkkien korostaminen tekstieditorissani- Osa 2
Luen täältä, miten tämä tehdään.
1. Avaa ’asetukset’ Sublime-tekstieditorissa & valitse ’näppäinsidonnaisuus’.
2. Lisää vasemmalle puolelle, välilehdelle ’user’ seuraava koodi:
{ "keys": , "command": "insert_snippet", "args": {"contents": " "} }
3. Tallennin sitten uudelleen avasin alkuperäisen (rikkinäisen 🙁 ) tiedoston.
Tottakai siellä oli vahingossa Alt- ja välilyöntipainikkeella ei- katkaiseva välilyönti:
HALLELUJAH .. Ajattelin.. Olen vihdoin korjannut vanhan skriptini…….
Ajoin sen uudestaan ja sain edelleen saman virheilmoituksen!
Tässä kohtaa olisi varmaan pitänyt miettiä:
”Sain sen kerran oikein ja onnistuin työstämään harjoituksen läpi ja suorittamaan sen loppuun. Aion vain lopettaa ja olla huolehtimatta tiedostosta, joka palauttaa virheilmoituksen.”
Mutta olen liian utelias / itsepäinen tyytyäkseni siihen, että annan virheen vain roikkua ensimmäisen skriptini yllä.
Ajoin irb:n terminaalissa.
Juoksutin oikein saamani tiedoston uudelleen & tiedoston, jossa oli virheilmoitus: