Project

General

Profile

Actions

Bug #2776

closed

can't return from lambda with outer block

Added by wanabe (_ wanabe) over 14 years ago. Updated over 13 years ago.

Status:
Rejected
Target version:
ruby -v:
ruby 1.9.2dev (2010-02-21 trunk 26722) [i686-linux]
Backport:
[ruby-dev:40453]

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 1 (0 open1 closed)

Related to Ruby master - Bug #1018: return in an eigenclass definitionClosedko1 (Koichi Sasada)01/16/2009Actions
Actions #1

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

Actions #2

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

Actions #3

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

Actions #4

Updated by wanabe (_ wanabe) over 14 years ago

  • Status changed from Open to Rejected

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0