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