Как отследить переменные счетчика в ruby, block, for, each, do - PullRequest
5 голосов
/ 04 января 2011

Я забыл, как отслеживать положение петель в Ruby.Обычно я пишу на JavaScript, AS3, Java и т. Д.

each:

counter = 0
Word.each do |word,x|
   counter += 1
   #do stuff
end 

for:

то же самое

while:

то же самое

block

Word.each  {|w,x| }

Это тот, о котором я действительно не знаю.

Ответы [ 3 ]

8 голосов
/ 04 января 2011

В дополнение к методу Array#each_with_index в Ruby 1.8 многие перечисляющие методы в Ruby 1.9 возвращают Enumerator при вызове без блока; Затем вы можете вызвать метод with_index, чтобы перечислитель также передавал индекс:

irb(main):001:0> a = *('a'..'g')
#=> ["a", "b", "c", "d", "e", "f", "g"]

irb(main):002:0> a.map
#=> #<Enumerator:0x28bfbc0>

irb(main):003:0> a.select
#=> #<Enumerator:0x28cfbe0>

irb(main):004:0> a.select.with_index{ |c,i| i%2==0 }
#=> ["a", "c", "e", "g"]

irb(main):005:0> Hash[ a.map.with_index{ |c,i| [c,i] } ]
#=> {"a"=>0, "b"=>1, "c"=>2, "d"=>3, "e"=>4, "f"=>5, "g"=>6}

Если вы хотите map.with_index или select.with_index (или подобное) в Ruby 1.8.x, вы можете сделать этот скучный, но быстрый метод:

i = 0
a.select do |c|
  result = i%2==0
  i += 1
  result
end

или вы можете получить более функциональное удовольствие:

a.zip( (0...a.length).to_a ).select do |c,i|
  i%2 == 0
end.map{ |c,i| c }
5 голосов
/ 04 января 2011

Если вы используете each_with_index вместо each, вы получите индекс вместе с элементом.Таким образом, вы можете сделать:

Word.each_with_index do |(word,x), counter|
   #do stuff
end

Для циклов while вам все равно придется самостоятельно следить за счетчиком.

3 голосов
/ 04 января 2011

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

Чтобы убрать запутанный лишний мусор и, возможно, пример с неправильной прописной буквой, мой код выглядел бы так:

words = get_some_words()
words.each_with_index do |word, index|
  puts "word[#{index}] = #{word}"
end

Я не уверен, что Sepp2K делал со странными (словом, х) вещами.

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