this と super と parent
kz> 3 times:{|| puts@this; }; > 3 3 3 kz> puts@this; > 3 times:{|| puts@local.parent.super; }; > LOBBY(0x1D5550D) LOBBY(0x1D5550D) LOBBY(0x1D5550D) LOBBY(0x1D5550D) kz> pp@local; > #bindings(0xC21495) { * super = LOBBY(0x1D5550D); }
3 times:{|| puts@this; } とすると、this が 3 になる件。
これは {|| puts@this; } を実行しているのが times メソッド内つまり this == 3 のコンテキスト内なので this が 3 になっている。
じゃあ {|| puts@this; } 関数を生成した箇所の this はどうやって取得するかというと local.parent.super で取得できることが判明。まず関数内の local を取り、その外側(parent) の local を取る。this は local の super に入っているので、それを受け取れば良い、と……。ややこしいな。
CodeBlock には this と local の2つの引数が渡されていて、そのうち local.super == this であることは確定しているんだから、this じゃなくて caller を渡せばいいのかも。ちょっと検討してみよう。