Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 带Return语句的块上的Ruby Yield不一致_Ruby On Rails_Ruby_Block_Yield - Fatal编程技术网

Ruby on rails 带Return语句的块上的Ruby 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 但是下面的方法

我试图理解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
但是下面的方法将起作用(尽管它将返回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