2013-06-05 4 views
7

я бегу следующий код:Как перебрать все, кроме первого элемента перечислимого

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

ответ

26

Как об этом?

[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 
+0

+1 бить меня на 29 секунд :) –

+0

@Anand: и у меня также есть пример вывода :) –

+0

Действительно, что-то мне нужно узнать у вас :) –

2

Попробуйте это:

a.shift  
a.each do |x| puts x end 
+0

Я отредактировал ans. Проверь сейчас. – Deepika

+1

Это мутирует исходный массив –

3

Вы могли бы сделать

a.drop(1).each do |x| puts x end 

EDIT:

Используйте метод map

b = [1,2,3].drop(1).map{|x| x} 
=> b will be [2, 3] 
+0

Это работает, есть ли что-нибудь более элегантное, например. что-то, что не требует от меня повторного удаления первого элемента? – Stefan

+0

@Stefan Да, я дал один ответ в соответствии с вами. Проверьте, соответствует ли он вашей потребностям или нет. –

0

Попробуйте следующий код

a=[1,2,3] 
a.drop(1) 
1

Как Замечание, если вы пытаетесь отобразить над всеми, кроме первого элемента массива, array.drop (1) .map {}, очевидно, не будет Работа. Вместо этого вы можете сделать что-то вроде:

[1,2,3].instance_eval { |a| [a.first] + a.drop(1).map { |e| e + 1 } } 
+0

бог, я так сильно тебя люблю –

+0

Разработчики Ruby гораздо страстнее разработчиков .NET –

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