ruto on Nostr: ...
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なんてものがあったなと思い出した。
Published at
2024-05-28 12:43:16Event JSON
{
"id": "fe187a4e67f8f388c2435d7d49a7359d1a57897ba5d9cbce153786b94d861095",
"pubkey": "2888961a564e080dfe35ad8fc6517b920d2fcd2b7830c73f7c3f9f2abae90ea9",
"created_at": 1716900196,
"kind": 1,
"tags": [],
"content": "RubyのEnumeratorのnewに無限ループするブロックを渡してもそのEnumeratorにtake(10)とかすると無限ループにならずに停止する。\n\nEnumerator::new do |y|\n a = 0\n loop do\n y \u003c\u003c a\n a += 1\n end\nend.take(10)\n\nでもbegin rescueで囲ってみても例外は投げられていないし、JavaScriptのgenerator的なものがRubyにもあるんだっけ、そういえばFiberとかあったなと思ってp Fiber.currentを入れてみても外と同じものが返ってくる。begin ensureで囲うとちゃんとensure部分が実行されるので大域脱出しているのは確か。\n各LLMに聞いても上手い答えが返ってこないし、と思ったらそういえばRubyには例外とは別にthrow/catchなんてものがあったなと思い出した。",
"sig": "a92c7661ff4a4094608bbbba4043e34f1c37c9db31722979153e67213494a99a60edbd775377e4fed5203171d2c52814aebc6aa921ab41821334a651d962886b"
}