Bug #2776

can't return from lambda with outer block

Added by _ wanabe over 5 years ago. Updated over 4 years ago.

[ruby-dev:40453]
Status:Rejected
Priority:Normal
Assignee:Yukihiro Matsumoto
ruby -v:ruby 1.9.2dev (2010-02-21 trunk 26722) [i686-linux] Backport:

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


Related issues

Related to Ruby trunk - Bug #1018: return in an eigenclass definition Closed 01/16/2009

History

#1 Updated by Shyouhei Urabe over 5 years ago

  • Assignee changed from Koichi Sasada to Yukihiro Matsumoto

=begin
異なっているのは事実ですが、どちらが正しいか(あるいは両方間違い)は議論の余地がありそうです。

# lambda(&proc) でprocをlambdaに変換できるかどうかの違い?
=end

#2 Updated by Nobuyoshi Nakada over 5 years ago

=begin
なかだです。

At Mon, 22 Feb 2010 13:13:47 +0900,
Shyouhei Urabe wrote in :

異なっているのは事実ですが、どちらが正しいか(あるいは両方間違い)は議論の余地がありそうです。

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

#3 Updated by Nobuyoshi Nakada over 5 years ago

=begin
なかだです。

At Mon, 22 Feb 2010 15:00:34 +0900,
Tanaka Akira wrote in :

Proc#lambda? のドキュメントに書いてありますが、
1.9 では、Proc オブジェクトが lambda かどうかという性質は
なるべく変えないというデザインになっています。

なんでそう変わったんでしたっけ?

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

=end

#4 Updated by _ wanabe over 5 years ago

  • Status changed from Open to Rejected

=begin
仕様であるようですので Reject させていただきます。
教えていただいてありがとうございました。
=end

Also available in: Atom PDF