@m_seki の

I like ruby tooから引っ越し

待ち合わせ

cometっぽいのが書きたくなったので、たくさんある実装のうちのなんていう名前かわからないけど、知っている状態と違う状態になったら返事がほしいよ! 作戦でやってみる。

当然だがTupleSpaceを使う。[:latest, ほげ]というタプルが最後の状態を保持するタプルってことにしよう。ほげはなんでも良いんだけど、時刻にする。

class Foo
  def initialize
    ...
    @ts = Rinda::TupleSpace.new(3)
  end

  def latest
    @ts.read([:latest, nil])[1]
  end

  def foo
    @ts.take([:latest, nil])
    begin
       ...
    ensure
      @ts.write([:latest, Time.now])
    end
  end
end

Rindaのタプルスペースのマッチングはcase equals(===)を使うので、このオブジェクトとこのオブジェクトは違う!を表現するには工夫が必要になっちゃう。今回はNjetという否定を表現するクラスを作ってみた。Foo#waitは自分が知っているの違う状態になるのを5秒(以上)待つ。

class Foo
  def wait(key)
    @ts.read([:latest, Njet.new(key)], 5)
  end
end

class Njet
  def initialize(value)
    @value = value
  end
  
  def ===(other)
    @value != other
  end
end

gitのインストールがうまく行かないんでcvsで。