RubyのEnumeratorのnewに無限ループするブロックを渡してもそのEnumeratorにtake(10)とかすると無限ループにならずに停止する。

Enumerator::new do |y|

a = 0

loop do

y << a

a += 1

end

end.take(10)

でもbegin rescueで囲ってみても例外は投げられていないし、JavaScriptのgenerator的なものがRubyにもあるんだっけ、そういえばFiberとかあったなと思ってp Fiber.currentを入れてみても外と同じものが返ってくる。begin ensureで囲うとちゃんとensure部分が実行されるので大域脱出しているのは確か。

各LLMに聞いても上手い答えが返ってこないし、と思ったらそういえばRubyには例外とは別にthrow/catchなんてものがあったなと思い出した。

Reply to this note

Please Login to reply.

Discussion

No replies yet.