2013-01-06 24 views
7

Các tài liệu cho Array#[]= ghi chú rằngMở rộng mảng với mặc định ưu tiên

Nếu chỉ số lớn hơn công suất hiện tại của mảng, mảng phát triển tự động.

Khi nó phát triển tự động, nó làm như vậy với nil giá trị:

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

Có thể xác định những gì mặc định dành cho những hai giá trị đầu tiên?

Hiện nay, tôi đang làm

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

Đó là một chút dài dòng.

Tôi đang sử dụng mảng, thay vì băm, vì chúng đại diện cho các giá trị tôi sẽ nhập vào bảng tính và thư viện tôi đang sử dụng (Axlsx) muốn có hàng được thêm dữ liệu theo hàng.

+0

'arr = Array.new (2, '') # => [" "," "]; arr [2] = "!"; arr => ["", "", "!"] '. Ít nhất nếu bạn chỉ muốn khởi tạo các phần tử n đầu tiên. – BernardK

+0

@BernardK 'Array.new (2), {''}' an toàn hơn 'Array.new (2, '')'. Xem "gotchas phổ biến" trong rdoc cho [Array.new] (http://www.ruby-doc.org/core-1.9.3/Array.html#method-c-new). –

Trả lời

3

Array#fill có thể là vé của bạn.

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' có lợi thế là mô tả ý định của tôi tốt. –

3

Điều gì về việc sử dụng hàm băm làm mảng? Nó có thể trông như thế này:

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] 

Có lẽ phương pháp này yêu cầu một số tinh chỉnh thêm để đáp ứng nhu cầu của bạn, ví dụ bạn có thể xác định phương pháp size và vân vân.

P.S. Nhận một mảng

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

Làm cách nào bạn chuyển giá trị từ hàm băm này sang phương thức của thư viện yêu cầu một mảng giá trị? –

+0

Cách xác định phương thức to_a sẽ mang lại định dạng yêu cầu? – megas

+0

@AndrewGrimm, xem cập nhật – megas

1

tôi đã có một cái nhìn nhanh chóng đến các tài liệu Array và tôi đã không tìm thấy gì hữu ích cho việc này ...

... nhưng nếu tôi hiểu rõ bạn cần phải thay thế các giá trị nil với các chuỗi trống ("") trước khi xuất dữ liệu của bạn vào bảng tính. Những gì về cuộc gọi to_s trên mỗi phần tử của mảng trước khi làm điều đó ?:

arr.map! &:to_s 
Các vấn đề liên quan