2016-11-19 5 views
0

Während eine Blase Sortierprogramm zu schaffen i in diesen Fehler lautete:nicht definierte Methode '<‘für nil: 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> 

weiß jemand, was bedeutet das? Hier ist der Code:

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]) 

Antwort

3

Die Fehlermeldung undefined method '<' for nil:NilClass bedeutet, dass Sie versuchen, < auf etwas aufzurufen, das nil ist.

In Ihrem Beispiel muss dies der if arr[cntr] < arr[cntr + 1] Vergleich sein. In einem nächsten Schritt müssen wir herausfinden, warum arr[cntr]nil ist. Ein Grund könnte sein, dass es im arr Array im cntr Index kein Element gibt, ein anderer Grund könnte sein, dass der Index cntr außerhalb der Grenzen des Arrays liegt. In Ihrem Beispiel ist dies der zweite Grund, der das Problem verursacht.

Warum ist der Index außerhalb der Grenzen? Werfen wir einen genaueren Blick haben, wie die Schleife bauen und verwenden [a, b, c] ein Beispiel Array so zu tun:

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 

Ops gibt es nicht nicht Indizes 3 und 4 im arr Array, weil Indizes Zählen beginnen mit 0 und In meinem Beispiel gibt es nur 3 Elemente (das macht den Index des letzten Elements 2).

Das Update:

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

Danke für die ausführliche Erklärung! – jibzoiderz

2

does anyone know what does that mean?

Es bedeutet, dass arr[cntr] ist gleich Null in diesem Ausdruck

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

Oh, und wenn dies eine Null ist, dann arr[cntr + 1] ist definitiv gleich Null.

Hinweis: Sie greifen auf Elemente außerhalb der Grenzen des Arrays zu.

+0

warum ist arr [0] gebundener aus? da ist eindeutig etwas da – jibzoiderz

+0

Warum denkst du ist es 0? –

+0

nvm löste es, indem er length-1 in die Nähe des Downtos legte – jibzoiderz

0

In Ihrem Code wird length variabler Wert 6 (length = arr.length) sein. Wenn Sie es bis 0 iterieren ... in der ersten Iteration wird cntr Variablenwert 6 sein. so arr[cntr] wird nil Wert erhalten, weil Sie auf Elemente außerhalb der Grenzen des Arrays zugreifen. Deshalb erhalten Sie undefined method < for nil:NilClass (NoMethodError) Fehler.

Verwandte Themen