Как добавить планировщик с циклом ruby? - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь кодировать twitchbot. Я хочу добавить планировщик с for loop.

Я пробовал этот код, но он просто печатает !prima. Кстати, таймер планировщика sume2 работает нормально.

require "rufus-scheduler"

scheduler = Rufus::Scheduler.new
sume = ['!prime', 'sea', 'ase', '!prima']
sume2 = ['30s', '20s', '10s', '40s']
s3 = sume2.length - 1

for x in 0..s3
  scheduler.interval sume2[x] do 
    puts sume[x]
  end 
end

Что я могу с этим поделать?

1 Ответ

2 голосов
/ 02 июня 2019

Ваша проблема здесь в том, что вы используете цикл for вместо метода Enumerable, такого как each.

Краткий ответ, просто измените for x in 0..s3 на sume2.each_index do |x|

Более длинный ответ, вы можете сравнить следующее:

for x in 0..3
  Thread.new { loop { puts(x); sleep 1 } }
end

с:

(0..3).each do |x|
  Thread.new { loop { puts(x); sleep 1 } }
end

Первый просто печатает 3 несколько раз, а второй печатает 1,2,3 как положено

Почему? Это потому что с циклом for. Ваша x переменная перезаписывает каждый цикл. Для каждого ваша x переменная ограничена блоком , и у вас есть замыкание .

Для более подробного объяснения см. Замыкания и циклы в Ruby , или https://scotch.io/tutorials/understanding-ruby-closures,, или просто Google "замыкания в ruby"

Обратите внимание, что в Ruby не является идиоматическим использование циклов for, по этой конкретной причине

...