かおすふぃーるど (Weblog)

ブログです.日記や技術メモや色々な記事へのリンクなどをつらつらと書き溜めていきます.

4 ヶ月越しの疑問が解決しました (コルーチンの this のこと)

2009-07-11 のエントリで悩んでいた,コルーチンを実行したときのテーブルの問題が解決しました.

::y <- 0;

class Cls {
 x = null;
 constructor() {
  x = 0;
 }
 function method() {
  //local cr = ::newthread(f); //←こう書いていたのを…
  local cr = ::newthread(f.bindenv(this)); //←こう書けばいい!
  cr.call();
  while (cr.getstatus() == "suspended") {
   print("while loop\n");
   cr.wakeup();
  }
 }
 //コルーチン本体
 function f() {
  if ("y" in this) print("y exist\n");
  if ("x" in this) print("x exist (success!)\n");
  for (local i = 0; i < 5; i++) {
   print("coro loop " + i + "\n");
   ::suspend();
  }
  return null;
 }
}

local c = Cls();
c.method();

とすると実行結果は

x exist (success!)
coro loop 0
while loop
coro loop 1
while loop
coro loop 2
while loop
coro loop 3
while loop
coro loop 4
while loop

となります.これで目的は達成されました.

このページの bindenv の節を見ていて気付きました.ようやくです,えぇ orz

ああー長かった orz
  • -
  • -