2016-11-19 11 views
0

私は、このエラーに遭遇したバブルソートプログラム作成中:未定義のメソッド `<」:NilClass

test.rb:8:in `block in bubble_sort': undefined method `<' for nil:NilClass (NoMethodError) 
    from test.rb:6:in `downto' 
    from test.rb:6:in `bubble_sort' 
    from test.rb:16:in `<main> 

を誰もがそれがどういう意味を知っていますか?ここでは、コードは次のようになります。

def bubble_sort(arr) 
    length = arr.length 
    sorted = false 


    length.downto(0) do |cntr| 

     if arr[cntr] < arr[cntr + 1] 

     end 


    end 
end 

bubble_sort([2,6,8,1,0,2]) 

答えて

3

エラーメッセージundefined method '<' for nil:NilClassは、<nilにコールしようとしていることを意味します。

あなたの例では、if arr[cntr] < arr[cntr + 1]の比較が必要です。次のステップでは、なぜarr[cntr]nilであるかを調べる必要があります。 1つの理由は、の配列にcntrのインデックスの要素がないこと、もう1つの理由は、インデックスcntrが配列の範囲外である可能性があります。あなたの例では、問題の原因となっているのは2番目の理由です。

インデックスが範囲外ののはなぜですか?ループがそうする例配列[a, b, c]を構築し、使用方法を詳しく見てみましょう:インデックスが0でカウントを開始するので

length = arr.length    # length = 3    # [a, b, c].length 
length.downto(0) do |cntr|  # 3.downto(0) do |cntr| 
    if arr[cntr] < arr[cntr + 1] # if arr[3] < arr[4] # in the first iteration 

オプス、インデックス34は、arr配列内に存在しないものではなく、私の例では3つの要素しかありません(最後の要素のインデックスは2になります)。

修正:

def bubble_sort(array) 
    (array.length - 2).downto(0).each do |index| 
    if array[index] < array[index + 1] 
     # ... 
    end 
    end 
end 
+0

詳細な説明をありがとう! – jibzoiderz

2

does anyone know what does that mean?

それは、arr[cntr]この表現

if arr[cntr] < arr[cntr + 1] 

ああではnilであり、この1つがnilであると、arr[cntr + 1]は間違いなく nilであることを意味しています。

ヒント:配列の範囲外の要素にアクセスしています。

+0

理由ですARR [0]バウンドのうち?明らかにそこに何かがあります – jibzoiderz

+0

なぜそれは0だと思いますか? –

+0

nvmは、[Array#[\]](http://ruby-doc.org/core-2.3.0/Array.html#)の文書に記載されているように、length-1をdowntoの近くに置くことで解決しました – jibzoiderz

0

lengthの変数値は6length = arr.length)になります。 最初の反復で0 ...に反復すると、cntrの可変値は6になります。 arr[cntr]は、配列の範囲外の要素にアクセスしているため、nilという値を取得しています。だからあなたはundefined method < for nil:NilClass (NoMethodError)というエラーになっています。

関連する問題