Автоматический счетчик в Ruby для каждого?

Я хочу использовать для каждого и счетчика:

i=0
for blah in blahs
    puts i.to_s + " " + blah
    i+=1
end

Есть ли лучший способ сделать это?

Примечание: Я не знаю, является ли blahs массивом или хэшем, но выполнение blahs[i] не сделает его более сексуальным. Также я хотел бы знать, как писать i++ в Ruby.


Технически, ответ Мэтта и Сквиге пришел первым, но я даю лучший ответ на парадоджу, поэтому немного разбросаны по точкам. Также в его ответе была заметка о версиях, которая по-прежнему актуальна (пока мой Ubuntu 8.04 использует Ruby 1.8.6).


Должен использовать puts "#{i} #{blah}", который намного более краткий.

Ответ 1

Как говорили люди, вы можете использовать

each_with_index

но если вам нужны индексы с итератором, отличным от "каждого" (например, если вы хотите сопоставить с индексом или что-то в этом роде), вы можете объединить счетчики с помощью метода each_with_index или просто использовать with_index:

blahs.each_with_index.map { |blah, index| something(blah, index)}

blahs.map.with_index { |blah, index| something(blah, index) }

Это то, что вы можете сделать с ruby ​​1.8.7 и 1.9.

Ответ 2

[:a, :b, :c].each_with_index do |item, i|
  puts "index: #{i}, item: #{item}"
end

Вы не можете сделать это с помощью. Мне обычно нравится более декларативный призыв к каждому лично. Отчасти потому, что он легко перейдет к другим формам, когда вы достигли предела синтаксиса for.

Ответ 3

Да, он collection.each для выполнения циклов, а затем each_with_index для получения индекса.

Вероятно, вы должны прочитать книгу Ruby, потому что это фундаментальный Ruby, и если вы этого не знаете, у вас будут большие проблемы (попробуйте: http://poignantguide.net/ruby/).

Взято из исходного кода Ruby:

 hash = Hash.new
 %w(cat dog wombat).each_with_index {|item, index|
   hash[item] = index
 }
 hash   #=> {"cat"=>0, "wombat"=>2, "dog"=>1}

Ответ 4

Если у вас нет новой версии each_with_index, вы можете использовать zip метод для объединения индексов с элементами:

blahs = %w{one two three four five}
puts (1..blahs.length).zip(blahs).map{|pair|'%s %s' % pair}

который производит:

1 one
2 two
3 three
4 four
5 five

Ответ 5

Что касается вашего вопроса о выполнении i++, вы не можете этого сделать в Ruby. Утверждение i += 1, которое у вас было, - это именно то, как вы должны это делать.

Ответ 6

Если blahs - это класс, который смешивается в Enumerable, вы должны это сделать:

blahs.each_with_index do |blah, i|
  puts("#{i} #{blah}")
end

Ответ 8

Если вы хотите получить индекс рубина для каждого, то вы можете использовать

.each_with_index

Вот пример, показывающий, как работает .each_with_index:

range = ('a'..'z').to_a
length = range.length - 1
range.each_with_index do |letter, index|
    print letter + " "
    if index == length
        puts "You are at last item"
    end
end

Это напечатает:

a b c d e f g h i j k l m n o p q r s t u v w x y z You are at last item