Ruby on rails 带Return语句的块上的Ruby Yield不一致
我试图理解ruby是如何处理yields和return语句的,并注意到有时,带有return语句的块上的yield是非法的,但有时是有效的。我有一个我正在努力解决的例子:Ruby on rails 带Return语句的块上的Ruby Yield不一致,ruby-on-rails,ruby,block,yield,Ruby On Rails,Ruby,Block,Yield,我试图理解ruby是如何处理yields和return语句的,并注意到有时,带有return语句的块上的yield是非法的,但有时是有效的。我有一个我正在努力解决的例子: def foo yield end def bar foo do return 'asdf' end end 现在,在上述情况下,我知道以下操作将失败: foo do return 'asdf' end > LocalJumpError: unexpected return 但是下面的方法
def foo
yield
end
def bar
foo do
return 'asdf'
end
end
现在,在上述情况下,我知道以下操作将失败:
foo do
return 'asdf'
end
> LocalJumpError: unexpected return
但是下面的方法将起作用(尽管它将返回nil而不是'asdf'):
我的问题是,为什么看起来相似的代码片段的反应会如此不同?是因为返回块需要一个方法上下文才能运行吗?更微妙的情况如下
def baz
yield
puts 'Hi'
end
def bif
baz do
return 'asdf'
end
end
bif
=> nil
在yield之后的“puts'Hi'”根本没有运行,我不知道为什么。Ruby Proc不能有return语句。看起来有效的返回语句实际上属于该方法(def…end) 一篇关于它的好文章:
搜索lambdas vs proc在您的
foo
示例中,第一个执行返回
,而不在方法或函数中。第二个在条内
有一个有效的返回
,因为它在一个方法内。在bif
情况下,在执行put
之前执行return
。因此,put
永远不会发生。这就好像baz
做了一个返回
,然后做了放置
。这个链接实际上相当不错。总结一下我目前的情况:使用返回执行的Proc确实需要返回一个上下文,该上下文基于声明它的位置。此外,ruby中的“block”表示法生成一个Proc,它在返回时停止执行。这与lambda不同,后者将继续。
def baz
yield
puts 'Hi'
end
def bif
baz do
return 'asdf'
end
end
bif
=> nil