[#43412] [Ruby 1.9 - Feature #4592][Open] Tempfileを直接保存したい — Takeyuki Fujioka <xibbar@...>

15 messages 2011/04/21

[#43453] ThreadGroup の強化案 — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

14 messages 2011/04/28
[#43901] ThreadGroup#make_local_space! (Re: ThreadGroup の強化案) — Hidetoshi NAGAI <nagai@...> 2011/06/25

永井@知能.九工大です.少々長いメールで失礼します.

[#43920] Re: ThreadGroup#make_local_space! (Re: ThreadGroup の強化案) — Urabe Shyouhei <shyouhei@...> 2011/06/26

ひっじょうに根本的な質問をするのですけれども、ThreadGroupって何に使うん

[#43978] Re: ThreadGroup#make_local_space! — Hidetoshi NAGAI <nagai@...> 2011/06/28

永井@知能.九工大です.

[ruby-dev:43423] (ruby-listから転載) lambda中のProc中のreturnの挙動について

From: m_takao <threewayhandshake@...>
Date: 2011-04-23 10:31:28 UTC
List: ruby-dev #43423
高尾と申します。
[ruby-list:47997]にて、lambda中のprocのreturnが変だという旨の投稿をさせていただいたのですが、dev向きの話題だということで、こちらで改めて投稿させて頂きます。

> ちょっと日本語では表しにくいのですが、件名の通り、lambda中のProc中のreturnの挙動が不可解だったため、バグかと思い、投稿します。
>
> a = lambda do
>  b = Proc.new do
>    return
>  end
>  b[]
> end
> a[]
>
> 上記のコードを実行すると、ruby1.8.7ではLocalJumpErrorが起こり、ruby1.9.1では正常終了します。
> lambda中のreturnはcallのreturnになり、Proc.new中のreturnは生成元のreturnになる筈なので、
> 正常終了が正しい挙動のように思います。
>
> また、
>
> def a
>  b  = lambda do
>    Proc.new do
>      return
>    end
>  end
>  b[][]
> end
> a
>
> を実行すると、ruby1.8.7、ruby1.9.1ともに正常終了します。
> こちらは、Proc.new中のreturnが実行されるときには生成元が既に終了しているので、LocalJumpErrorが起こるのが正しい挙動のように思います。

また、上記投稿に対し、信岡さんが詳しく調査して下さり、以下の通りにまとめて頂きました。

> そこらへんの混乱があることを踏まえつつ発言の意図を汲み取ると
>
> ・[Ruby 1.8] proc 直下での return 式は、その proc を含んでいるメソッドを抜ける
> ・[Ruby 1.9] proc 直下での return 式は、その proc を含んでいるメソッドまたは
> 最も内側の lambda を抜ける (『1.9 では,lambda を「メソッド呼び出し」っぽく扱う,
> という原則があったはず』 という発言)
> ・[Ruby 1.9] lambda の中で生成された proc が、lambda の実行を終了したあとに
> 呼び出された場合 (orphan な proc の呼び出し) は LocalJumpError にするのが良いと
> 考えられるが、実装的に難しいし特に対応しなくても困らないと考えているため
> 実装しない (『レアケース過ぎるかなあ,とも思うので,対応しなくても,
> 特に困らないかとは思います』 という発言)
>
> という感じなのかなーと思いました。

現状、rubyの実装方針は上記の通りになっている (本件のreturnの挙動はバグではない/バグだが対処保留中である) と理解して良いでしょうか?

In This Thread

Prev Next