如何使用 ruby 循环添加调度程序?

How to add scheduler with ruby loop?

我正在尝试编码 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

我该怎么办?

您的问题是您使用的是 for 循环而不是 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 变量都是 的范围并且你有一个 闭包 .

有关更多说明,请参阅 Closures and for loops in Ruby, or https://scotch.io/tutorials/understanding-ruby-closures,或仅参阅 google "closures in ruby"

请注意,由于这个特殊原因

,在 Ruby 中使用 for 循环不是惯用的