返回内部for循环内部lambda在Ruby 1.8中崩溃

use*_*008 2 ruby lambda for-loop return

在Ruby 1.8(我的版本是1.8.7-72)中,这段代码:

foo = lambda do
  for j in 1..2
    return
  end
end
foo.call
Run Code Online (Sandbox Code Playgroud)

崩溃与LocalJumpError:

test2.rb:3: unexpected return (LocalJumpError)
    from test2.rb:2:in `each'
    from test2.rb:2
    from test2.rb:6:in `call'
    from test2.rb:6
Run Code Online (Sandbox Code Playgroud)

为什么这样做?但是,它似乎在我的Ruby 1.9版本上运行良好.

编辑:这不仅仅是在lambda内部返回; 以下运行正常:

foo = lambda do
  return
end
foo.call
Run Code Online (Sandbox Code Playgroud)

Yeh*_*atz 8

发生的事情是lambda中间的for语句被内部转换为块.在Ruby中,块内的返回语句的作用域是它们的封闭方法.考虑以下:

def bar
  foo = lambda do
    for j in 1..2
      return j
    end
  end
  foo[]
end
p bar
Run Code Online (Sandbox Code Playgroud)

在运行时bar,1返回,因为return它的范围是整个bar方法.要从块返回,您要使用nextbreak两者都采用参数.考虑:

def bar
  foo = lambda do
    for j in 1..2
      break j
    end
  end
  foo[] + 1
end
p bar
Run Code Online (Sandbox Code Playgroud)

此中断会从块返回,并阻止任何后续迭代.在这种情况下,调用bar将返回2,因为迭代器将返回1,foo[] + 1因此将返回2.

如果所有这些听起来令人困惑,那么要实现的主要内容是返回内部块的范围限定为周围方法,并且没有周围方法,LocalJumpError则引发a.