Ruby - каждое начальное смещение

Как установить начальное смещение дляeach цикл в рубине? Я хочу, чтобы цикл начался сa[3] вместоa[0], Как мне установить это?

<code>a = [ab, cd, ef, gh, hi, jk]

a.each do |i|
#some stuff
end
</code>

Ответы на вопрос(5)

Это поможет тебе

a[3..-1].each do |i|
  #your logic
end
Решение Вопроса

возможно, более прямая и понятная возможность - использоватьArray#drop:

a.drop(3).each do |i|
  # do something with item i
end

Теперь это действительно хорошо, если сочетается с другими методами, унаследованными отEnumerable, так что скорее всего есть лучшая альтернатива вашему императивуeach петля. Допустим, вы хотите отфильтровать извлеченный фрагмент и впоследствии преобразовать его:

a = [0,1,2,3,4,5,6,7]
a.drop(3).select(&:even?).map { |x| x * 2 }
# => [8, 12]

Или, скажем, вы хотите распечатать список всех значений:

a = ["1", "2", "3", "4", "5"]
puts a.drop(3).join("\n")

Выход

4
5

Эти особенности, унаследованные от функционального программирования, делают Ruby таким сильным:)

 Niklas B.17 нояб. 2014 г., 19:53
@ Vass В LISP и более поздних версиях Haskell, которые сильно зависят от постоянных односвязных списков, этот стиль довольно распространен (например, вы найдете там классические функцииmap, filter, take, drop, zip и т. д., что вы также найдете в Ruby'sEnumerable module)
 Donato26 янв. 2015 г., 23:32
Было бы неплохо увидеть множество таких методов, как drop, при реализации бинарного поиска или другого алгоритма сортировки
 Niklas B.27 янв. 2015 г., 00:29
@ Donato Я совсем не уверен, что ты имеешь в виду
 Vass17 нояб. 2014 г., 18:05
Какие функциональные языки программирования повлияли на этот стиль программирования?
Benchmark

)

require 'benchmark/ips'

a = Array.new(1000) { |i| i } 
drop_point = 500

Benchmark.ips do |x|
  x.report('drop(x)') do
    a.drop(drop_point).each { |el| el + 1 }
  end

  x.report('[x...-1]') do 
    a[drop_point..-1].each { |el| el + 1 }
  end

  x.report('for in') do
    n = drop_point
    size = a.size
    for i in n...size
      a[i] + 1
    end
  end

  x.report('while') do
    size = a.size
    i = drop_point
    while i < size
      a[i] + 1
      i += 1
    end
  end

  x.compare!
end
Полученные результат
Warming up --------------------------------------
             drop(x)     4.142k i/100ms
            [x...-1]     4.125k i/100ms
              for in     3.239k i/100ms
               while     5.391k i/100ms
Calculating -------------------------------------
             drop(x)     42.485k (± 2.3%) i/s -    215.384k in   5.072524s
            [x...-1]     42.533k (± 2.3%) i/s -    214.500k in   5.045832s
              for in     32.855k (± 2.5%) i/s -    165.189k in   5.030958s
               while     53.489k (± 4.5%) i/s -    269.550k in   5.049793s

Comparison:
               while:    53489.3 i/s
            [x...-1]:    42532.8 i/s - 1.26x  slower
             drop(x):    42484.7 i/s - 1.26x  slower
              for in:    32855.4 i/s - 1.63x  slower
Выводы

Как и ожидалось, старый добрыйwhile самый быстрый, так как не имеетblock распределение, но я бы предпочел либо[x...-1] илиdrop(x) так как они более читабельны

Большинство Rubyist забыли про старый добрый цикл:

n = 3
for i in n...a.size
  puts a[i]
end
 Boris Stitnicky01 мая 2012 г., 12:21
Huh? Каждый также использует do / end? Если вы хотите новую область, не используйте закрытие процедур, используйте вызов метода внутри цикла. Если есть принципиальная разница между for и каждым в отношении их блока кода, я бы хотел это знать (я тоже недооцениваю циклы:)
 Niklas B.01 мая 2012 г., 12:18
Потому что это отстой, так как не вводит новую область видимости, которая нелогична, так как используетdo/end. Кроме того, OP хотел перечислить элементы массива, а не индексы.
 Boris Stitnicky01 мая 2012 г., 12:26
Спасибо еще раз, это то, что происходит, если вы печатаете быстро. Пожалуйста, исправьте мой ответ. Но мне бы очень хотелось узнать, что вы имеете в виду, не вводя новую область? Как чувствуешь разницу?
 Boris Stitnicky01 мая 2012 г., 12:22
В любом случае, я добавил [i] вместо i в код, спасибо.
 Andrew Grimm02 мая 2012 г., 00:50
+ 1, потому что блоки могут замедлить ваш код, а также из-за грубости по отношению к постеру.

Используйтеeach на @ Подчас массива. В приведенном ниже примере от четвертого элемента до конца:

a[3..-1].each do |i|
  #some stuff
end
 JohnMerlino23 февр. 2014 г., 22:49
a [a.size - 1] .each do | i |

Ваш ответ на вопрос