我正在尝试将 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/