Автоматический счетчик в 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
Ответ 7
перечисляемых перечислимых серий довольно хорошо.
Ответ 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