&block をパラメーターとして受け入れ、n 秒ごとに実行できるセルロイド アクターを作成しようとしています。しかしcall
、ループ内からブロックするevery
と、何もしないように見えますか?
このクラスの例を見てみましょう:
require 'celluloid/autostart'
class FooBar
include Celluloid
def initialize(&block)
@block = block
execute_block
every(2) do
puts "tick"
execute_block
end
end
def execute_block
puts "tock"
@block.call
end
end
次のことを試してみると:
a = FooBar.new { puts "Hi" }
次に、この紛らわしい出力が得られます。
tock
Hi
tick
tock
tick
tock
tick
tock
tick
tock
tick
...
execute_block
ブロックの外側から初めて呼び出すと、正常に動作し、タイマーが正しく動作every
していることがわかります...しかし、ブロックは毎回呼び出されるわけではありませんか?every
私が間違っていることに光を当てることができる人はいますか?
更新:をputs "tock"
下に移動する@block.call
と、出力がまったく得られないことに気付きました...?