Подтвердить что ты не робот

Как перебрать все, кроме первого элемента перечислимого

Я запускаю следующий код:

> 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, так и цикл.

4b9b3361

Ответ 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 элементов.