2009-05-13 2 views
4

Ich schreibe eine Methode, die variable Längen von Arrays und komprimiert und konvertiert sie zu passenden Array-Längen.Gibt es in Ruby eine Art unsichtbare Array-Terminierung?

Die Methode akzeptiert eine Array-Länge von 50 bis 126. .. und konvertiert sie basierend auf Parametern beim Aufruf. Dies bedeutet, dass ich dynamisch auf Bereiche zugreife, die beim Methodenaufruf angegeben werden. Dies bedeutet auch, dass ich auf Indizes des Arrays zugreifen werde, die nicht existieren werden. Zusätzlich dazu kann der Bereich, auf den ich zugreife, gleich sein. Dies ist, wo mein Problem liegt: es scheint, dass die Abschluss Tasche eines Arrays seltsam verhält, wenn er mit einem Bereich zugreifen, wie auf jedem anderen inexistent Index gegen

>> a = [0, 1, 2, 3, 4] 
# => [0, 1, 2, 3, 4] 

>> a[5] 
# => nil 

>> a[4..4] 
# => [4] 

>> a[6..6] 
# => nil 

>> a[5..5] 
# => [] <------GGRAAAAAhhh!!! Thought you were nil 

>> a[5..7] 
# => [] <-------you too 

>> a[6..7] 
# => nil <-----but you are behaving 

Weiß jemand, warum dies geschieht? Es ist ein zusätzlicher Test gegen ein leeres Array für meinen Code, aber ich bin neugieriger, nachdem ich diesen Bug den ganzen Tag lang in meiner Rails-App verfolgt habe. FWIW Ich bin mit Ruby-1.8.6 auf Mac OS X, Patchlevel 114

Antwort

0

Es ist eine Funktion von Ruby Arrays. Dies geschieht nur, wenn Sie eine Teilmenge eines Arrays aufnehmen, deren erster Endpunkt der Länge entspricht.

Es erlaubt Ihnen, solche Dinge zu tun:

a = [1,2,3] 
a[3..3] = [4,5] # a = [1,2,3,4,5] 

EDIT: Eigentlich kann man tun, dass mit jedem Bereich. Mein Fehler.

+0

Ja können Sie, aber ich denke immer noch, Sie sind auf etwas hier, denn wenn [3..3] in Ihrem Fall Null zurückgegeben, Sie wäre nicht in der Lage, das Ende eines Arrays auf diese Weise hinzufügen. Wenn ich zum Ende und nicht zu irgendeiner Position einschließlich des Endes hinzufüge, würde ich a = a + [4,5] oder a << 4 << 5 though bevorzugen. –

Verwandte Themen