ruby - 为什么显式返回会影响 Proc?

标签 ruby return proc-object

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不管你是否要求。鉴于此,我感到惊讶的是 foobar foo 决定了不同的输出包含明确的 returnProc f .

有人知道为什么会这样吗?

最佳答案

Ruby 具有三种结构:

  1. block 不是对象,它是由 { ... }do 创建的。 .结束
  2. proc 是由 Proc.newproc 创建的 Proc 对象。
  3. lambda 是由 lambda(或 Ruby 1.8 中的 proc)创建的 Proc

Ruby 具有三个从某物返回的关键字:

  1. return 终止它所在的方法或 lambda。
  2. next 终止它所在的 block 、过程或 lambda。
  3. break 终止屈服于 block 或调用它所在的 proc 或 lambda 的方法。

在 lambda 表达式中,return 的行为类似于 next,无论出于何种原因。 nextbreak 之所以这样命名,是因为它们最常与 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/

相关文章:

python - 如何从递归 Python 函数返回值?

java - 我如何从一个方法返回 2 个值

python - 调用自身的函数仅返回其调用的第一个结果

ruby - 在 Ruby 的 DSL 中使用 procs

Ruby 链表实现 #remove!阻止无效

php - 从偏态正态分布生成随机数

Ruby:Proc.new { 'waffles' } 与 proc { 'waffles' }

wrapper - tcl:包装一个同名的proc

ruby - 在 Ruby 中覆盖方法调用?

ruby - 为什么在这里使用 lambda 而不是两个预定义的方法?