2015-04-19 6 views

ответ

5
b.fill(b.size..a.size - 1) { [0, 0] } 
+1

Хороший ответ. Я не знал о форме [Array # fill] (http://ruby-doc.org/core-2.2.0/Array.html#method-i-fill), которая принимает диапазон в качестве аргумента. Интересно, что это работает даже тогда, когда 'b.size> a.size' (который, я думаю, является свойством Range). Вы могли бы, конечно, написать '(b.size ... a.size)'. –

4

На мой взгляд, это более читаемым:

(a.length - b.length).times do 
    b << [0, 0] 
end 
+1

С точки зрения ясности, это лучшее решение. – Drenmi

2

Мне нравится fill, но это, кажется, были приняты. Вот способ вернуть желаемый массив без мутации b. Это не просили, но это может быть полезно в некоторых приложениях:

Array.new(a.size) { |i| b[i] || [0,0] } 
    #=> [[1, 81], [0, 0], [0, 0]] 

Можно, конечно, поставить b = впереди.

Другой на месте способ:

b.concat [[0,0]]*(a.size-b.size) 

Эй, это весело. Другой (не предполагающая никаких элементов b равной nil):

a.each_index { |i| b[i] ||= [0,0] } 
b 
+0

'Если b нужно изменить на месте, поставьте b = спереди.' - это не на месте, оно переназначается. –

+0

Вы правы. Благодарю. Я сделал редактирование. –

4

Не самый эффективный, но довольно читаемым:

b << [0,0] until a.size == b.size 

Немного более эффективным:

b.concat [[0,0]] * (a.size-b.size) 
1

Я бы appendwhile размер меньше, потому что я думаю, что он хорошо читается:

a = [[1, 2], [22, 11], [18, 9]] 
b = [[1, 81]] 

b << [0, 0] while b.size < a.size 

b #=> [[1, 2], [0, 0], [0, 0]] 
Смежные вопросы