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有三种结构:
- A 嵌段是不是一个对象,并且由创建
{
... }
或do
... end
。 - 一个PROC是一个
Proc
通过创建的对象Proc.new
或proc
。 - 一个lambda是一个
Proc
通过创建lambda
(或proc
在红宝石1.8)。
Ruby有三个关键字,从返回一些东西:
-
return
终止该方法或λ是英寸 -
next
终止块,PROC,或λ是英寸 -
break
终止该屈服于块或调用的PROC或λ是在该方法中。
在lambda表达式, return
的行为就像next
,无论出于何种原因。 next
和break
被命名为他们,因为他们是最常见的类似方法使用方式each
,其中,终止该块会导致重复,将恢复与集合的下一个元素,并终止each
会使你跳出循环。
如果您使用
return
的定义中
foo
,你将返回从
foo
,哪怕是块或proc中。 要从块返回,您可以使用
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"
这是语义Proc
S; 它不一定对所有块的语义。 我同意这是一个有点混乱。 这是有更大的灵活性(也许部分导致Ruby没有规范,除了它的实现)。
该行为在定义Proc
实施。 Lambda
小号行为不同,所以如果你想你的return
不是退出了封闭的方法,使用lambda表达式 。 或者,省略了return
,从您的关键字Proc
。
RUBYS倒闭的深入研究是在这里 。 这是一个奇妙的揭露。
所以:
def foo
f = Proc.new {
p2 = Proc.new { return "inner proc"};
p2.call
return "proc"
}
f.call
return "foo"
end
def foo2
result = Proc.new{"proc"}.call
"foo2 (proc result is: #{result})"
end
def bar
l = lambda { return "lambda" }
result = l.call
return "bar (lambda result is: #{result})"
end
puts foo
# inner proc
puts foo2
# foo (proc result is: proc)
puts bar
# bar (lambda result is: lambda)
想想这样说:Proc.new只需创建的代码块,调用函数的一部分。 PROC /λ创建具有特殊的绑定匿名函数。 一个小的代码示例将帮助:
def foo
f = Proc.new { return "return from foo from inside Proc.new" }
f.call # control leaves foo here
return "return from foo"
end
相当于
def foo
begin
return "return from foo from inside begin/end" }
end
return "return from foo"
end
所以很明显,回报率将刚刚从函数“富”返回
相反:
def foo
f = proc { return "return from foo from inside proc" }
f.call # control stasy in foo here
return "return from foo"
end
等效于(忽略绑定因为在该例子中不使用):
def unonymous_proc
return "return from foo from inside proc"
end
def foo
unonymous_proc()
return "return from foo"
end
这是因为显然不会从foo的返回,并继续到下一个语句。