2017-06-28 27 views
1

私はRubyを学び、最近目次を作成する課題を完了しました。コードが動作する、しかし、コードの末尾に、次のエラーが発生します。未定義メソッド `ljust 'for nil:NilClass(NoMethodError)

table_of_contents2.rb:23:in `<main>': undefined method `ljust' for nil:NilClass (NoMethodError) 

私は二重のアウトライン変数は、whileループ内puts outlineを行うことによってnilではないことを確認し、変更してみましたoutlineをコード全体で@outline$outlineに変更できますが、エラーは持続しています。

完全なコードは以下の通りです:

lineWidth = 40 

chapters = ["Chapter 1: Numbers", "Chapter 2: Letters", 
      "Chapter 3: Variables"] 
pages = ["page 1","page 72","page 118"] 

puts "Table of Contents".center lineWidth 


outline = [] 

i = 0 

while i < 3 
    outline.push(chapters[i]) 
    outline.push(pages[i]) 
    i = i + 1 
end 

j = 0 

while j <= outline.length 
    puts outline[j].ljust(lineWidth/2) + 
    outline[j+1].rjust(lineWidth/2) 
    j = j + 2 
end 

はなぜこのエラーが発生していますか?そして、コードが正常に実行された後、なぜそれが起こっていますか?

補足:ターミナルでコードを実行しています。コードを実行するときの端末内での完全な表示は、次のとおりです。

$ ruby table_of_contents2.rb 
      Table of Contents    
Chapter 1: Numbers    page 1 
Chapter 2: Letters    page 72 
Chapter 3: Variables   page 118 
table_of_contents2.rb:23:in `<main>': undefined method `ljust' for nil:NilClass (NoMethodError) 

ありがとうございました!

答えて

0

プログラミング言語は0でインデックスを開始しますが、数値(配列の長さなど)は通常そのまま使用されます。

だから、それがどのように長い(.length)を尋ねられたとき、配列が5つの項目を返しますが、配列の最大のインデックスがあなたのケース4.

で、あなたが(配列の最後の項目まで取得します<=)、存在するインデックスよりも大きいインデックスにアクセスしてください(インクリメンタが小さいかどうかを確認しています)。<

変更<=ので、それはまた、インクリメンタは、配列のサイズに等しい場合があることを行うません。

while j < outline.length


それです。

0インデックス作成、実際はシンプルですが、データをどのように反復処理するかを考えると非常にすばやく混乱します。

Rubyにはこれを抽象化する便利な機能がいくつかあります。 .each

collection.each do |i, element| 
    puts i 
    puts element 
end 
1

outline[outline.length]にアクセスしようとしています。その理由はnilです。これにより

while j <= outline.length 

:この行変更

(Rubyで配列インデックスは0間とlength - 1である)

while j < outline.length 
+0

「<」または「outline.length - 1」のいずれかを使用します。どちらも使用する必要はありません。 –

+0

私の答えを更新しました。ありがとう –

5

問題はラインwhile j <= outline.lengthです。

while j < outline.lengthである必要があります。

しかし、Rubyでは、手動でカーソルを維持することは、しばしば悪い習慣とみなされます。あなたのプログラムがちなみに

line_width = 40 

chapters = ["Chapter 1: Numbers", "Chapter 2: Letters", 
      "Chapter 3: Variables"] 
pages = ["page 1","page 72","page 118"] 

puts "Table of Contents".center line_width 

chapters.zip(pages).each do |chapter, page| 
    puts chapter.ljust(line_width/2) + page.rjust(line_width/2) 
end 

のように書き換えることができ、Rubyのプログラマは(クラス名とモジュール名を除く)キャメルケースに下線を好むので、私はline_widthlineWidthを変更しました。

関連する問題