2012-06-02 2 views
3

Я хочу перебирать часть массива. Например, я пытаюсь напечатать все элементы, кроме первого:ruby ​​- лениво перебирать массив

array[1..-1].each {|e| puts e} 

Но array[1..-1] строит новый Array. Это расточительно, если array очень большой. Другой простой подход:

(1...array.size).each { |i| puts array[i] } 

Это работает. Но мне интересно, есть ли еще более элегантные трюки.

ответ

5

Рубин 2.0 будет поставляться Lazy enumerables (фантастическая новость!), Потому что теперь мы можем разогреть двигатели с использованием драгоценных камней, как enumerable-lazy:

require 'enumerable/lazy' 
xs.lazy.drop(1).each { |x| puts x } 

Это не плохо, но концептуально это точно не применяется к вашему делу, так как у вас уже есть массив, а не ленивый объект (связанный список), который вы должны пройти, чтобы отбросить элементы (хорошо, мы просто отбрасываем один элемент здесь, это не будет разблокировать сделку). Таким образом, вы можете просто абстрагировать свое решение (которое использует диапазон) как Enumerable#each_from(start_index), если вы планируете использовать его много.

Подробнее: Вы можете также создать расширение для перечислим-ленивогоArray#lazy_slice(range), который будет возвращать Enumerable#lazy объект. Это также выглядит довольно неплохо: xs.lazy_slice(1..-1).each { |x| puts x }

1
array.each_with_index {|x, i| puts x unless i.eql?0} 
+2

'ставит х, если i.zero?' Heh :) – fl00r

+0

@ fl00r да :) Есть множество способов сравнения. – kiddorails

Смежные вопросы