Wednesday, April 01, 2009

継続とファイバー

継続とファイバーをちょっと勉強した
分かったこと

[継続]
  • Rubyではcallccブロック以降の処理を継続オブジェクトとしてラップできる
  • ラップした継続オブジェクトはそれをcallすることで開始される
  • 継続オブジェクトはcallccのブロック引数で他のコンテキストに持ち運べ、そこで実行できる
  • 例えば継続オブジェクトを別のメソッドに渡してそこで実行すると、基のメソッドにリターンせずに処理が終わる
  • 継続オブジェクトをcallするとき引数を渡すことができ、それは継続オブジェクトの返り値になる
  • 継続は1.9で非推奨となった
[Fiber]
  • 特定の処理をFiberオブジェクトとしてラップできる
  • Fiberオブジェクトはそれをresumeすることで開始される
  • Fiberオブジェクトはそれを変数でラベリングして他のコンテキストに持ち運べ、そこで実行できる
  • Fiberオブジェクトをresumeするとき引数を渡すことができ、それはFiberオブジェクトのブロック引数としてブロックの内部処理に渡される
  • Fiberオブジェクトのブロック内でFiber.yieldすると処理をFiberオブジェクトを呼んだ先に戻すことができる
  • Fiber.yieldするとき引数を渡すことが、それはFiber.resumeの返り値となる
  • Fiberは1.9から導入された
だから継続でできることはFiberでできるはず

No comments: