2017-01-24 2 views
0

Kurze Frage:
Warum meine Methode (die Blöcke akzeptiert) gibt Original-Array anstelle von geändert.Ruby, bubble_sort_by (arr), der Code funktioniert, aber das ursprüngliche Array wird zurückgegeben

Lange Frage:
-Code wie folgt aus:

def bubble_sort_by(array) 
    array.each_with_index do |outer, outer_index| 
    array.each_with_index do |inner, inner_index| 
     if yield(outer, inner) > 0 
     if outer_index < inner_index 
       p "outer after if: " + outer  # for debugging, indented for clarity 
       p "inner after if: " + inner  # for debugging 
      outer, inner = inner, outer 
       p "outer after swap: " + outer  # for debugging 
       p "inner after swap: " + inner  # for debugging 
     end 
     end 
    end 
    end 
end 

bubble_sort_by(["hi","hello","hey"]) do |left,right| 
    left.length - right.length 
end 

In irb Ich sehe, dass die Werte von outer und inner vertauscht (sortiert), aber der Rückgabewert ist immer noch das Original-Array.

2.3.3 :1223 >  end 
"outer after if: hello" 
"inner after if: hey" 
"outer after swap: hey" 
"inner after swap: hello" 
=> ["hi", "hello", "hey"] 
2.3.3 :1224 > 

Ich schrieb früher ähnliche Methode bubble_sort (ohne Block) mit sehr ähnlichem Code und die Original-Array wurde von getauscht dort Werten ersetzt.
Ich verstehe nicht, warum die vertauschten Werte nicht in der hier genannten Methode gespeichert werden, und stattdessen erhalte ich original Array.

Antwort

2

Sie Wert von Array-Element ändern müssen, verwenden müssen. Dieser Code ist:

+0

Diese Antwort löste auch mein nächstes Problem, indem ich Array nicht sortierte, wo das größte Element an erster Stelle steht (oder am kürzesten Platz). Nur diese ersetzen: 'äußeren, innen = Innen, outer' mit diesem: ' array [outer_index], array [inner_index] = array [inner_index], array [outer_index] ' ist das Sortieren nicht in das Array„worst Fallszenario ". Ich muss tiefer analysieren, was ab und zu passiert. Danke. – ToTenMilan

2

Sie tauschen die lokalen Variablen nur

outer, inner = inner, outer 

Dies wird array nicht ändern, um das Array zu ändern Sie []=

array[n] = value 
Verwandte Themen