Автоматический счетчик в Ruby для каждого? - PullRequest
131 голосов
/ 10 февраля 2009

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

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

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

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


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


Надо было использовать puts "#{i} #{blah}", что намного лаконичнее.

Ответы [ 8 ]

188 голосов
/ 10 февраля 2009

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

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.

54 голосов
/ 10 февраля 2009
[:a, :b, :c].each_with_index do |item, i|
  puts "index: #{i}, item: #{item}"
end

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

10 голосов
/ 10 февраля 2009

Да, это 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}
6 голосов
/ 19 мая 2010

Если у вас нет новой версии 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
4 голосов
/ 16 февраля 2009

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

1 голос
/ 27 августа 2017

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

.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
1 голос
/ 11 февраля 2009

Перечисляемая перечисляемая серия довольно хороша.

1 голос
/ 10 февраля 2009

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

blahs.each_with_index do |blah, i|
  puts("#{i} #{blah}")
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...