Bug #2776
closedcan't return from lambda with outer block
Description
=begin
http://pc12.2ch.net/test/read.cgi/tech/1264635554/685 で質問されていたのですが
1.8 と 1.9 で lambda の挙動が異なっています。
test.rb¶
class Foo
def initialize(&func)
@func = lambda(&func)
end
def bar(x)
@func.call(x)
end
end
foo = Foo.new{ |x| return x**2 }
p foo.bar(2)
$ ruby1.8 -v test.rb
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]
4
$ ./ruby -v test.rb
ruby 1.9.2dev (2010-02-21 trunk 26722) [i686-linux]
test.rb:9:in block in <main>': unexpected return (LocalJumpError) from test.rb:6:in
call'
from test.rb:6:in bar' from test.rb:10:in
'
=end
Updated by shyouhei (Shyouhei Urabe) over 14 years ago
- Assignee changed from ko1 (Koichi Sasada) to matz (Yukihiro Matsumoto)
=begin
異なっているのは事実ですが、どちらが正しいか(あるいは両方間違い)は議論の余地がありそうです。
lambda(&proc) でprocをlambdaに変換できるかどうかの違い?¶
=end
Updated by nobu (Nobuyoshi Nakada) over 14 years ago
=begin
なかだです。
At Mon, 22 Feb 2010 13:13:47 +0900,
Shyouhei Urabe wrote in [ruby-dev:40454]:
異なっているのは事実ですが、どちらが正しいか(あるいは両方間違い)は議論の余地がありそうです。
lambda(&proc) でprocをlambdaに変換できるかどうかの違い?¶
そういうことですね。1.9を1.8に合わせるならこんな感じ。
Index: proc.c
--- proc.c (revision 26728)
+++ proc.c (working copy)
@@ -401,12 +401,15 @@ proc_new(VALUE klass, int is_lambda)
if (procval) {
- rb_proc_t *proc;
if (RBASIC(procval)->klass == klass) {
-
return procval;
- }
- else {
-
VALUE newprocval = proc_dup(procval);
-
RBASIC(newprocval)->klass = klass;
-
return newprocval;
-
GetProcPtr(procval, proc);
-
if ((proc->is_lambda != 0) == (is_lambda != 0))
-
}return procval;
- procval = proc_dup(procval);
- RBASIC(procval)->klass = klass;
- GetProcPtr(procval, proc);
- proc->is_lambda = is_lambda ? TRUE : FALSE;
- return procval;
}
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
=end
Updated by nobu (Nobuyoshi Nakada) over 14 years ago
=begin
なかだです。
At Mon, 22 Feb 2010 15:00:34 +0900,
Tanaka Akira wrote in [ruby-dev:40456]:
Proc#lambda? のドキュメントに書いてありますが、
1.9 では、Proc オブジェクトが lambda かどうかという性質は
なるべく変えないというデザインになっています。
なんでそう変わったんでしたっけ?
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
=end
Updated by wanabe (_ wanabe) over 14 years ago
- Status changed from Open to Rejected
=begin
仕様であるようですので Reject させていただきます。
教えていただいてありがとうございました。
=end