2013-01-06 6 views
7

Die Dokumentation Array#[]= stellt fest, dassExpand Array mit bevorzugtem Standard

Wenn Indizes sind größer als die aktuelle Kapazität des Arrays, die Array automatisch wachsen.

Wenn es wächst automatisch, tut sie dies mit nil Werte:

arr = [] 
arr[2] = "!" 
arr # => [nil, nil, "!"] 

Ist es möglich, zu bestimmen, was der Standard für die ersten beiden Werte?

Derzeit bin ich tun

arr = [] 
index = 2 
currently_uninitialized_value_range = (arr.length)...(index) 
default_values = currently_uninitialized_value_range.map{ "" } 
arr[currently_uninitialized_value_range] = default_values 
arr[index] = "!" 
arr # => ["", "", "!"] 

die ein wenig ausführlich ist.

Ich benutze ein Array, anstatt einen Hash, weil sie die Werte darstellen, die ich in eine Tabelle eingeben werde, und die Bibliothek, die ich verwende (Axlsx), zieht es vor, Daten in der Zeile hinzuzufügen nach Reihe.

+0

'arr = Array.new (2, '') # => [" "," "]; arr [2] = "!"; arr => ["", "", "!"] '. Zumindest wenn Sie nur die ersten n Elemente initialisieren wollen. – BernardK

+0

@BernardK 'Array.new (2), {''}' ist sicherer als 'Array.new (2, '')'. Siehe "common gotchas" im rdoc für [Array.new] (http://www.ruby-doc.org/core-1.9.3/Array.html#method-c-new). –

Antwort

3

Array#fill Ihr Ticket sein könnte.

arr = [] 

index = 2 
arr.fill("", arr.length...index) 
arr[index] = "!" 
# => ["", "", "!"] 

index = 5 
arr.fill("", arr.length...index) 
arr[index] = "!" 
# => ["", "", "!", "", "", "!"] 

index = 1 
arr.fill("", arr.length...index) 
arr[index] = "!" 
#=> ["", "!", "!", "", "", "!"] 
+0

+1 "fill" hat den Vorteil, meine Absicht gut zu beschreiben. –

3

Was ist mit der Verwendung von Hash als Array? Es könnte wie folgt aussehen:

h = Hash.new do |hash,key| 
    0.upto(key) { |i| hash[i] = "" unless hash.has_key?(i) } 
end 

h[5] 
h[0] #=> "" 
h[4] #=> "" 
h.keys #=> [0, 1, 2, 3, 4, 5] 

Vielleicht dieser Ansatz einige zusätzliche Optimierungen benötigen, um Ihre Anforderungen zu erfüllen, zum Beispiel können Sie Methode size und so weiter definieren.

P.S. ein Array erhalten

h.values #=> ["", "", "", "", "", ""] 
+0

Wie würden Sie Werte von diesem Hash an eine Bibliotheks-Methode übergeben, die ein Array von Werten benötigt? –

+0

Wie wäre es, Methode to_a zu definieren, die das erforderliche Format bringt? – megas

+0

@AndrewGrimm, siehe das Update – megas

1

ich in die Array Dokumentation einen schnellen Blick hatte und ich habe nicht nichts nützlich für diese finden ...

... aber wenn ich gut verstanden müssen Sie nil Werte ersetzen mit leeren Zeichenfolgen (""), bevor Sie Ihre Daten in die Tabelle exportieren. Was ist Call to_s auf jedem Element des Arrays vor das tun ?:

arr.map! &:to_s