具有Return语句的块上的Ruby Yield是不一致的

时间:2013-08-20 21:57:09

标签: ruby-on-rails ruby block yield

我试图理解ruby如何处理yield和return语句,并注意到有时候,带有return语句的块的yield是非法的,但有时会起作用。我有以下我正在努力的例子:

def foo
  yield
end

def bar
  foo do
    return 'asdf'
  end
end

现在在上述情况下,我知道以下情况会失败:

foo do
  return 'asdf'
end

> LocalJumpError: unexpected return

但是以下内容可行(虽然它将返回nil而不是'asdf'):

bar
=> nil 

我的问题是,为什么类似的代码片段反应如此不同?是因为返回块需要运行方法上下文吗?以下是一个更微妙的情况

def baz
  yield
  puts 'Hi'
end

def bif
  baz do
    return 'asdf'
  end
end

bif
=> nil

在收益率完全没有运行之后“把'嗨'”,我不知道为什么。

1 个答案:

答案 0 :(得分:0)

Ruby Proc不能有return语句。似乎有效的返回语句实际上属于方法(def ... end)。

关于它的好文章: http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/