Příští měsíc jsem se přihlásil na intenzivní programátorský výcvikový tábor Maker Academy. Abych si udělal náskok, napadlo mě, že si projdu knihu Learn Ruby the Hard Way od Zeda Shawa.

Cvičení 25 zřejmě testuje mé schopnosti řešit problémy, a tak jsem si řekl, že napíšu příspěvek, ve kterém zdokumentuji, jak jsem vyřešil a pak opravil chybová hlášení. Tento příspěvek je určen nováčkům ve světě programování, protože si představuji, že jde o velmi základní věci, které chápu špatně.

Toto byl můj první pokus o napsání skriptu cvičení 25 v editoru:

Když jsem to spustil v terminálu, dostal jsem následující chybové hlášení:

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

První, co jsem udělal, bylo, že jsem si vygooglil chybové hlášení.

Řešení chybové hlášky pomocí Googlu

Našel jsem odpověď na Stackoverflow.

Řeklo mi to, že jsem na Macu omylem napsal Alt + Space, a proto se vytvořila nelomená mezera. Tu Ruby považuje za součást názvu proměnné na rozdíl od bílé mezery, kterou měla být.

Uváděl dvě řešení tohoto problému:

1. Problém s mezerami v názvu proměnné. Přemapování Alt + Mezera na mezeru, aby se tento překlep už neopakoval.

2. Zvýraznění neviditelných znaků v textovém editoru, aby se překlep okamžitě uvědomil.

Zdálo se, že přednost má řešení 2, tak jsem si řekl, že nejdřív zkusím tento způsob. Zdálo se mi to nejjednodušší a nejrychleji opravitelné. Chtěl jsem vyloučit problém off-the-shelf s mým pokaženým kódem.

Zvýraznění neviditelných znaků v textovém editoru – část 1

Dále jsem googlil, jak zvýraznit neviditelné znaky v mém textovém editoru, Sublime Text editor 2.

Ukázalo se, že to má být výchozí funkce mého textového editoru.

Při každém zvýraznění textu se mi mají objevit malé bílé tečky jako na obrázku níže (podívejte se zblízka, jsou tam na prázdných místech):

Takže jsem zvýraznil text a nic se nestalo:

Rozhodl jsem se, že problém „nelámání“ mezer zde prozatím zaparkuji a pokusím se vyřešit chybové hlášení jednodušším způsobem. V kódování jsem relativně nový, takže další řešení pro nalezení ‚nelámavých‘ mezer; oprava předvoleb nebo výchozího přiřazení kláves v editoru Sublime Text se nezdálo jako nejjednodušší způsob řešení mého problému.

Googlování samotného cvičení

Další věc, kterou jsem udělal, bylo vygooglování ‚Ex25 naučit se Ruby těžkou cestou‘, abych zjistil, zda má někdo jiný stejné problémy jako já. Našel jsem blog s vypsaným cvičením. Porovnal jsem naše soubory slovo od slova na obrazovce.

Nezaznamenal jsem žádný rozdíl mezi našimi soubory (což naznačuje, že skryté nezalomené mezery mohou být tím, co způsobuje mou chybu).

Potřeboval jsem však vyloučit myšlenku, že by někde byl překlep, kterého jsem si nevšiml, a tak jsem celý soubor vypsal znovu. Usoudil jsem, že se tak rychleji dostanu k řešení.

Můj druhý soubor fungoval, když jsem ho spustil v terminálu. Žádné chybové hlášení.

Tady je druhý soubor:

Zajímalo mě, kde jsem udělal chybu ještě u prvního souboru, tak jsem je porovnal řádek po řádku.

Porovnání funkčního skriptu s tím s chybovou hláškou

Porovnal jsem je na obrazovce a všiml jsem si dvou rozdílů, které jsem postupně opravil.

1. Při volání dřívějších funkcí v pozdějších např.

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

Funkce ex25.break_word vypadala, že nebyla rozpoznána v chybovém skriptu (ten vpravo), zatímco Ex25. se v druhém skriptu (vlevo) objevila modrá.

Nejzřejmější důvod, který mě napadl, byl, že „e“ nebylo psáno s velkým písmenem. Změnil jsem tedy všechny Ex25 v rozbitém skriptu na velké e.

Skript jsem spustil, ale stále se mi objevovala stejná chybová hláška:

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

2. Při spuštění skriptu se objevilo stejné chybové hlášení. Další snadnou opravou, které jsem si všiml, bylo, že název souboru a název funkce v poškozeném skriptu byly stejné, ale v mém novém skriptu jsem soubor pojmenoval EX25b.rb.

Možná právě tento rozdíl v pojmenování byl příčinou chyby?

Ne..

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

Kdybych si přečetl celé cvičení v Learning Ruby the Hard Way, viděl bych, že tohle není řešení:

„Modul Ex25 nemusí být v souboru s názvem ex25.rb. Zkuste ho vložit do nového souboru s náhodným názvem, pak tento soubor naimportujte a uvidíte, jak budete mít Ex25 stále k dispozici.“

Takže jsem se rozhodl vrátit k prvnímu řešení, nezalamování mezery, protože jsem nyní vyčerpal snadné možnosti a za nic na světě jsem neviděl rozdíl mezi chybou a správným skriptem.

Zvýraznění neviditelných znaků v mém textovém editoru – část 2

Návod, jak to udělat, jsem si přečetl zde:

1. Jak to udělat? Otevřete „předvolby“ v textovém editoru Sublime & vyberte „vazby kláves“.

2. Vložte na levou stranu, do záložky „uživatel“ následující kód:

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

3. Uložil a pak znovu otevřel původní (rozbitý 🙁 ) soubor.

Jistě tam byl náhodný Alt a mezerník nelámající mezeru:

HALLELUJAH .. myslel jsem. Konečně jsem opravil svůj starý skript…….

Znovu jsem ho spustil a STÁLE jsem měl stejnou chybovou hlášku!

Tady jsem se měl asi zamyslet:

„Jednou jsem to pochopil správně a podařilo se mi cvičení zpracovat a dokončit. Prostě to zabalím a nebudu se starat o soubor, který vrací chybovou hlášku.“

Ale jsem příliš zvědavý/tvrdohlavý na to, abych se spokojil s tím, že nad prvním skriptem nechám viset chybu.

Spustil jsem irb v terminálu.

Spustil jsem soubor, který jsem dostal správně, znovu & soubor s chybovou hláškou:

Zkoušel jsem přijít na to, jaký je mezi oběma soubory rozdíl.

Možná to bylo v adresářích, do kterých byly uloženy?

Zkontroloval jsem to a opravdu byly uloženy v různých adresářích.

Uložil jsem tedy chybový soubor do stejného adresáře jako soubor, který fungoval…..

Neviděl jsem žádný jiný rozdíl, tak jsem ….

zkopíroval a vložil text z fungujícího souboru do chybového souboru.

Pak se stalo něco strašného!

OBA soubory přestaly fungovat!!!!

Stejná chybová hláška se objevila u prvního souboru a nyní pracovní soubor vracel ‚false‘, když jsem ho ‚vyžadoval‘ pomocí irb:

Možná příčina tohoto problému:

Příliš mnoho souborů se stejným nebo podobným názvem ve stejném adresáři?

Smazal jsem všechny kromě jednoho… A jako mávnutím kouzelného proutku ..

FUNGUJE TO !!!

Spustil jsem v terminálu pracovní skript pro Ex25 a postupoval podle návodu, jak pomocí irb volat jeho funkce.

Tady jsou mé výsledky a vysvětlení toho, co se děje:

Správný skript pro Ex25

Spouštění skriptu v příkazovém řádku. ‚irb‘

Označil jsem místa, kde jsem musel trochu přemýšlet, jak to funguje. Zde je mé vysvětlení:

1. Vypisuje ‚wait‘, protože funkce působí na pole ‚words‘, které není setříděné. Setříděné pole se jmenuje ‚sorted_words‘.

2. Pole ‚Words‘ má ve funkci print posunuté první a poslední („all“ a ‚wait‘ ) hodnoty.

3. Volání na pole ‚sorted_words‘, ne na pole ‚words‘, které má chybějící hodnoty. Proto je ‚all‘ stále v poli.

4….Zdá se, že na obrázku chybí … Takže jsem to tehdy jasně považoval za nepodstatné, proto to samé udělám teď znovu.

5.. Použití původní proměnné ‚sentence‘ a její předání přes funkci. Ta tuto proměnnou věta rozdělí do pole pokaždé, když narazí na mezeru. Pak pomocí funkce Ex25.sort_words seřadí toto pole slov.

6. Vezme původní proměnnou ‚sentence‘, rozdělí ji na pole slov a pak vypíše první a poslední hodnotu tohoto pole.

Takže jsme se nyní dostali ke konci mého zápolení s cvičením 25 z knihy Learn Ruby the Hard way. Doufám, že se vám líbilo a bylo pro vás užitečné mé higgledy piggldy řešení problémů, které nakonec vedlo k tomu, že jsem překonal chybová hlášení uvedená při spuštění mého skriptu. Prosím, obraťte se na mě, pokud byste náhodou při čtení tohoto &příspěvku potřebovali pomoc s jeho pochopením.

Užijte si to, 🙂

Tento příspěvek byl původně zveřejněn ZDE.

Articles

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.