ruby - 在 Ruby block 中使用 'return'

标签 ruby lambda return proc-object

我正在尝试将 Ruby 1.9.1 用于嵌入式脚本语言,以便将“最终用户”代码写入 Ruby block 中。一个问题是我希望用户能够在 block 中使用“return”关键字,这样他们就不必担心隐式返回值。考虑到这一点,这就是我希望能够做的事情:

def thing(*args, &block)
  value = block.call
  puts "value=#{value}"
end

thing {
  return 6 * 7
}

如果我在上面的示例中使用“return”,我会得到一个 LocalJumpError。我知道这是因为有问题的 block 是 Proc 而不是 lambda。如果我删除“return”,代码就可以工作,但我真的更希望能够在这种情况下使用“return”。这可能吗?我试过将 block 转换为 lambda,但结果是一样的。

最佳答案

在此上下文中简单地使用next:

$ irb
irb(main):001:0> def thing(*args, &block)
irb(main):002:1>   value = block.call
irb(main):003:1>   puts "value=#{value}"
irb(main):004:1> end
=> nil
irb(main):005:0>
irb(main):006:0* thing {
irb(main):007:1*   return 6 * 7
irb(main):008:1> }
LocalJumpError: unexpected return
        from (irb):7:in `block in irb_binding'
        from (irb):2:in `call'
        from (irb):2:in `thing'
        from (irb):6
        from /home/mirko/.rvm/rubies/ruby-1.9.1-p378/bin/irb:15:in `<main>'
irb(main):009:0> thing { break 6 * 7 }
=> 42
irb(main):011:0> thing { next 6 * 7 }
value=42
=> nil
  • return 总是从方法返回,但是如果你在 irb 中测试这个片段你没有方法,这就是你有 LocalJumpError
  • 的原因
  • break 从 block 中返回值并结束调用。如果您的代码块被 yield.call 调用,则 break 也会从该迭代器中断
  • next 从 block 返回值并结束其调用。如果您的 block 被 yield.call 调用,则 next 会将值返回到调用 yield 的行

关于ruby - 在 Ruby block 中使用 'return',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2325471/

相关文章:

ruby - Puppet 4.10 中的自定义函数仅返回哈希中的第一个数组项

arrays - 查看另一个字符串中是否包含大量字符串的更快方法

c - 为什么我不能返回这个数组?

java - 使用 Kotlin 和 lambda 返回接口(interface)实现

java - 如何按最新日期对列表进行排序?

c++ - 在 C++ 中返回线性列表和时间复杂度

c++ - 'List::operator=': 必须返回一个值

arrays - 在 Ruby 中合并多维数组

Ruby:将美元(字符串)转换为美分(整数)

c++ - 允许 lambda/回调函数作为模板参数使用多个签名