def foo
f = Proc.new { return "return from foo from inside proc" }
f.call # control leaves foo here
return "return from foo"
end
def bar
b = Proc.new { "return from bar from inside proc" }
b.call # control leaves bar here
return "return from bar"
end
puts foo # prints "return from foo from inside proc"
puts bar # prints "return from bar"
我以为 return
关键字在 Ruby 中是可选的,你总是 return
不管你是否要求。鉴于此,我感到惊讶的是 foo
和 bar
foo
决定了不同的输出包含明确的 return
在Proc f
.
有人知道为什么会这样吗?
最佳答案
Ruby 具有三种结构:
- block 不是对象,它是由
{
...}
或do
创建的。 .结束
。 - proc 是由
Proc.new
或proc
创建的Proc
对象。 - lambda 是由
lambda
(或 Ruby 1.8 中的proc
)创建的Proc
。
Ruby 具有三个从某物返回的关键字:
return
终止它所在的方法或 lambda。next
终止它所在的 block 、过程或 lambda。break
终止屈服于 block 或调用它所在的 proc 或 lambda 的方法。
在 lambda 表达式中,return
的行为类似于 next
,无论出于何种原因。 next
和 break
之所以这样命名,是因为它们最常与 each
等方法一起使用,其中终止 block 将导致迭代使用集合的next 元素恢复,并终止each
将导致您中断 循环。
如果在
foo
的定义中使用 return
,您将从 foo
返回,即使它在 block 或过程中也是如此。要从 block 中返回,您可以改用 next
关键字。
def foo
f = Proc.new { next "return from foo from inside proc" }
f.call # control leaves foo here
return "return from foo"
end
puts foo # prints "return from foo"
关于ruby - 为什么显式返回会影响 Proc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1435743/