拡張ライブラリで無限ループ
先日、v1.4.5でMiyako.main_loopメソッドを実装したのですが、
breakしたときに脱出する方法が分からない。
というわけで、eval.cをソースハック〜♪
検索してみたら、rb_loopなんていうメソッドを発見。
どんなカラクリかな〜・・・え???
(元ソースより抜粋)
for(;;){ rb_yield(Qnil); }
こんだけ???
狐につままれながらも、以下のコードを作って、実際にESCキー押したら、たしかにbreakしました。
(C側)
staic VALUE miyako_main_loop(VALUE self){ while(1){ rb_funcall(mInput, id_update, 0); // mInput = Miyako::Input rb_yield(Qnil); rb_funcall(mScreen, id_update, 0); // mScreen = Miyako::Screen } }
(Ruby側)
include MiyakoMiyako.main_loop do
break if Input.quit? || Input.pushed_any?(:esc)
end
Rubyのナカでは、どこで脱出してんの???
ホワイ???