Как перебрать все, кроме первого элемента перечислимого
Я запускаю следующий код:
> a = [1,2,3].collect
=> #<Enumerator: [1, 2, 3]:collect>
> b = a.next
=> 1
> a.each do |x| puts x end
1
2
3
=> [nil, nil, nil]
Я ожидаю, что результат do
будет 2, 3
, так как я уже прочитал первый элемент a
. Как я могу добиться результата 2, 3
элегантно?
Edit:
Чтобы уточнить, я не хочу пропустить первую запись, я просто хочу обработать ее по-другому. Поэтому я хочу как b
, так и цикл.
Ответы
Ответ 1
Как насчет этого?
[1,2,3].drop(1).each {|x| puts x }
# >> 2
# >> 3
Здесь вы можете продолжить итератор
a = [1,2,3]
b = a.each # => #<Enumerator: [1, 2, 3]:each>
b.next # skip first one
loop do
c = b.next
puts c
end
# >> 2
# >> 3
Ответ 2
Вы могли бы сделать
a.drop(1).each do |x| puts x end
ИЗМЕНИТЬ:
Использовать метод map
b = [1,2,3].drop(1).map{|x| x}
=> b will be [2, 3]
Ответ 3
Попробуйте следующее:
a.shift
a.each do |x| puts x end
Ответ 4
Как побочный элемент, если вы пытаетесь сопоставить все, кроме первого элемента массива, array.drop(1).map {}, очевидно, не будет работать. Вместо этого вы можете сделать что-то вроде:
[1,2,3].instance_eval { |a| [a.first] + a.drop(1).map { |e| e + 1 } }
Ответ 5
Попробуйте использовать следующий код
a=[1,2,3]
a.drop(1)
Ответ 6
Правильное решение здесь: Enumerable#skip(n)
.
drop
отбирает перечисляемое в массив, затем оно удаляет указанный элемент из массива и возвращает этот массив, что иногда нежелательно и всегда неэффективно.
skip(n)
вернет новый перечислитель, который при перечислении (и если) не выдаст первые N элементов.