2013-01-06 11 views
7

Dokumentacja dla Array#[]= zauważa, że ​​Rozwiń tablicę z preferowanym domyślnie

Jeśli indeksy są większe niż obecnie pojemności tablicy, tablica rośnie automatycznie.

Kiedy nie rosną automatycznie, robi to z nil wartości:

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

Czy to możliwe, aby określić, co domyślnie jest dla tych dwóch pierwszych wartości?

Obecnie robię

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 # => ["", "", "!"] 

który jest trochę rozwlekły.

Używam tablicy, a nie hash, ponieważ reprezentują one wartości, które zamierzam wprowadzić do arkusza kalkulacyjnego, a biblioteka, z której korzystam (Axlsx) woli mieć dodany wiersz danych według rzędów.

+0

'arr = Array.new (2, '') # => [" "," "]; arr [2] = "!"; arr => ["", "", "!"] '. Przynajmniej jeśli chcesz zainicjować tylko pierwsze n elementów. – BernardK

+0

@BernardK 'Array.new (2), {''}' jest bezpieczniejsze niż 'Array.new (2, '')'. Zobacz "typowe błędy" w dokumencie rdoc dla [Array.new] (http://www.ruby-doc.org/core-1.9.3/Array.html#method-c-new). –

Odpowiedz

3

Array#fill może być przepustką.

+0

+1 "wypełnienie" ma tę zaletę, że dobrze opisuje mój zamiar. –

3

Co z używaniem skrótu jako tablicy? To może wyglądać następująco:

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] 

Może to podejście wymaga pewnych dodatkowych poprawek do zaspokojenia swoich potrzeb, na przykład można zdefiniować metodę size i tak dalej.

P.S. Uzyskać tablicę

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

W jaki sposób przekażesz wartości z tego skrótu do metody biblioteki, która wymaga tablicy wartości? –

+0

Co powiesz na określenie metody to_a, która przyniesie wymagany format? – megas

+0

@AndrewGrimm, patrz aktualizacja – megas

1

miałem szybki wygląd dokumentacji Array i nie mogę znaleźć nic przydatna dla ...

... ale jeśli dobrze zrozumiałem trzeba wymienić nil wartości z pustymi ciągami znaków ("") przed wyeksportowaniem danych do arkusza kalkulacyjnego. Co o wezwanie to_s na każdym elemencie tablicy przed zrobić ?:

arr.map! &:to_s