Есть ли альтернатива использованию переменной счетчика в каждом цикле do в Ruby? - PullRequest
4 голосов
/ 05 ноября 2010

Я выводлю список элементов из массива в Ruby. Мне нужно вывести позицию каждого элемента в массиве, а также значение. Я думал, что я был умным, используя индекс значения, когда я перебирал массив, а не устанавливал переменную временного счетчика, но я чувствовал себя обессиленным, когда у меня был массив с дублирующимися элементами. Смотри ниже ...

array = ["a","b","c","a"]
array.each do |letter|
 puts "Position: #{array.index(letter)} - Letter: #{letter}"
end

# Position: 0 - Letter: a
# Position: 1 - Letter: b
# Position: 2 - Letter: c
# Position: 0 - Letter: a    # Oops! That's not the position of that item.

Ниже приведен самый эффективный способ генерации желаемого результата или есть лучший способ сохранить присваивание переменной счетчика, содержащееся в каждом цикле do?

array = ["a","b","c","a"]
counter = 0
array.each do |letter|
  puts "Position: #{counter} - Letter: #{letter}"
  counter += 1
end

# Position: 0 - Letter: a
# Position: 1 - Letter: b
# Position: 2 - Letter: c
# Position: 3 - Letter: a

Ответы [ 3 ]

11 голосов
/ 05 ноября 2010
array = ["a","b","c","a"]
array.each_with_index do |letter,i|
  puts "Position: #{i} - Letter: #{letter}"
end

Кроме того, если вам понадобится использовать метод map, вы можете использовать модификатор .with_index :

["a","b","c","a"].map.with_index { |e,i| [e,i] }

=> [["a", 0], ["b", 1], ["c", 2], ["a", 3]]
3 голосов
/ 05 ноября 2010

Это можно сделать просто с помощью each_with_index:

 a.each_with_index{ |o,i| puts "position #{i} - letter #{o}" }
1 голос
/ 05 ноября 2010

Вы могли бы сделать кое-что times.:)

array.length.times do |i|
  puts "Position: #{i} - Letter: #{array[i]}"
end

Обратите внимание, я только изучаю Ruby - это может быть зло или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...