我正在尝试使用 Ruby 1.9.1 作为嵌入式脚本语言,以便在 Ruby 块中编写“最终用户”代码。这样做的一个问题是,我希望用户能够在块中使用“return”关键字,这样他们就不必担心隐式返回值。考虑到这一点,我希望能够做这样的事情:
def thing(*args, &block)
value = block.call
puts "value=#{value}"
end
thing {
return 6 * 7
}
如果我在上面的示例中使用“return”,我会收到 LocalJumpError。我知道这是因为有问题的块是 Proc 而不是 lambda。如果我删除“return”,该代码就可以工作,但我真的更希望能够在这种情况下使用“return”。这可能吗?我尝试将块转换为 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
从块返回值并结束其调用。如果你的块被调用yield
or .call
, then break
也脱离了这个迭代器
-
next
从块返回值并结束其调用。如果你的块被调用yield
or .call
, then next
返回值到行yield
被称为
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)