如何使用 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
循环不是惯用的
我正在尝试编码 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
循环不是惯用的