
来月、激しいコンピュータ プログラミング ブートキャンプ、Maker Academy に入学することにしました。 先手を打つために、Zed Shaw の Learn Ruby the Hard Way という本を読んでみようと思いました。
練習問題 25 は私の問題解決能力を試しているようなので、エラー メッセージを解決して修正した方法を記録した投稿をしようと思いました。 この投稿は、私が間違っているのは非常に基本的なことだと思うので、プログラミングの世界の初心者に向けたものです。

これは私のエディタで演習25のスクリプトを書く最初の試みでした。

これをターミナルで実行すると、次のエラーメッセージが出ました:
ex25.rb:2:in `<main>': undefined local variable or method `ex25' for main:Object (NameError)
最初にやったことは、エラーメッセージをググることです。
Solving the Error Message with Google
Stackoverflow で答えを見つけました。
それによると、Mac で誤って Alt + Space と入力したため、非改行スペースが作成されたそうです。 これは、Ruby では変数名の一部と見なされ、本来の空白文字とは異なります。
この問題に対する 2 つの解決策が示されています。 Alt + Space をスペースにリマップして、このタイプミスが再び起こらないようにする。
2. テキスト エディタで見えない文字をハイライト表示して、タイプミスにすぐに気づく。 最もシンプルで素早く修正できそうだったからです。
Highlight invisible characters in my text editor – Part 1
次に、Sublime Text editor 2 で見えない文字を強調する方法をググりました。
テキストを強調表示するたびに、以下の画像のような小さな白い点が見えるはずです (よく見ると、空のスペースにあります):

そこでテキストを強調しましたが何も起こりませんでした。

私は、「非改行」スペースに関する問題をとりあえずここに留め、より簡単な方法でエラー メッセージを解決しようと思いました。 Sublime Text Editor の環境設定やデフォルトのキー割り当てを修正することです。
Googling the exercise itself
次にしたことは、私と同じ問題を抱えている人がいないか、「Ex25 learn Ruby the hard way」をグーグルで調べることでした。 演習がタイプアウトされたブログを見つけました。
私たちのファイルをスクリーン上で一語一語比較してみました。
私たちのファイルの間に違いは見当たりませんでした(隠れた非改行スペースが私のエラーを引き起こしている可能性があることを示唆しています)。
私の 2 番目のファイルは、ターミナルで実行したときに動作しました。 エラーメッセージはありません。
これが 2 番目のファイルです。

最初のファイルでまだ間違っていたところに興味があり、1 行ずつ比較しました。
作業中のスクリプトとエラーメッセージのあるスクリプトを比較する
画面上でそれらを比較し、2 つの違いに気づきましたので、1 つずつ修正しました。 例えば、以前の関数が後の関数で呼ばれた場合、
def ex25.print_first_and_last(sentence)
words = ex25.break_word .. etc
エラースクリプト(右側)ではex25.break_word関数が認識されていないように見えるのに対し、他のスクリプト(左側)ではex25.が青く表示されました。
最も明らかな理由として思いつくのは、「e」が大文字ではなかったということでした。

スクリプトを実行しても、同じエラーメッセージが表示されました:
ex25.rb:2:in `<main>': undefined local variable or method `ex25' for main:Object (NameError)
2. 次に気づいた簡単な修正は、壊れたスクリプトのファイル名と関数名が同じだったことですが、新しいスクリプトでは、ファイル名を EX25b.rb.
Maybe it was the difference in naming that was responsible for the error?
Nope …
ex25.rb:2:in `<main>': undefined local variable or method `ex25' for main:Object (NameError)
もし私が Learning Ruby the Hard Way のエクササイズを全部読んでいたら、これが答えではないことがわかったでしょう。 ランダムな名前の新しいファイルに入れて、そのファイルをインポートして、どのように Ex25 が使用可能か確認してください。”
そこで、私は最初の解決策、非改行スペースに戻ることにしました。
Highlight invisible characters in my text editor- Part 2
この方法は、こちらで読みました。 Sublime テキスト エディター & の「環境設定」を開き、「キー割り当て」を選択します。

2. 左側の「ユーザー」タブに以下のコードを挿入します。
{
"keys": ,
"command": "insert_snippet",
"args": {"contents": " "}
}


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

HALLELUJAH … I thought …私、思ったんです。 やっと古いスクリプトを修正した……
もう一度実行したら、まだ同じエラーメッセージがありました!
ここでおそらく私は考えるべきでした:
「一度正しくやって、なんとか演習をやり遂げられたんだ」と。
しかし、私はあまりにも好奇心が強く、頑固なので、最初のスクリプトでエラーが発生したままにしておくことにしました。
正しくできたファイル & エラーメッセージのあるファイル:

二つのファイルの違いは何か考えてみた。
保存されたディレクトリの違いでしょうか?
調べてみると、確かに異なるディレクトリに保存されていました。
そこで、エラーファイルを動作したファイルと同じディレクトリに保存しました……。
他に違いがなかったので、…
動作中のファイルからエラーファイルにテキストをコピーして貼り付けました。
それからひどいことが起こりました!
両方のファイルが動作しなくなりました!
最初のファイルには同じエラーメッセージが表示され、今度は作業ファイルが irb で ‘required’ したときに ‘false’ を返してきました:

この問題の考えられる原因:
同じディレクトリに同じか似た名前のファイルを多く持ちすぎたのでしょうか?
1つを除いてすべて削除しました…そして魔法のように…
IT WORKED !!!
ターミナルでEx25用のワーキングスクリプトを実行し、irbを使って機能を呼び出す方法の説明に従って実行しました。
以下は、私の結果と、何が起こっているのかの説明です。
Ex25の正しいスクリプト

コマンドラインでのスクリプトの実行 ‘irb’

動作について少し考えなければならない点にラベルを付けておきました。 以下は私の説明です。
1. 関数がソートされていない配列「words」に対して動作しているため、「wait」と表示されます。 ソートされた配列は ‘sorted_words’ と呼ばれます。
2. ‘words’ 配列の最初と最後の値 (“all” と ‘wait’) が print 関数でずらされました。
3. 欠けた値を持つ ‘words’ 配列ではなく ‘sorted_words’ 配列で呼び出しています。
4…Seems to be missing from the picture …so I clearly deemed it irrelevant then therefore I will do the same again now…
5. 元の’sentence’変数を使い、これを関数に通しています。 これは、スペースに遭遇するたびに、この文の変数を配列に分割しています。
6.元の変数 ‘sentence’ を使って、単語の配列に分解し、その配列の最初と最後の値を表示しています。 このスクリプトを実行したときに表示されるエラーメッセージに打ち勝つために、私の大げさな問題解決を楽しんで、そして役立てていただけたら幸いです。 もし、これを読んでいる人が & 理解するのに手助けが必要なら、私に連絡してください。
Enjoy, 🙂
This post was originally published HERE.