为什么return关键字会导致我的'if block'出现问题?

时间:2009-05-15 03:15:27

标签: ruby

以下代码可以正常使用:

person = {:a=>:A, :b=>:B, :c=>:C}
berson = {:a=>:A1, :b=>:B1, :c=>:C1}

kerson = person.merge(berson) do | key, oldv, newv |
if key == :a
  oldv
elsif key == :b
  newv
else
  key
end
end

puts kerson.inspect

但如果我在“if block”中添加return,我会收到错误:

person = {:a=>:A, :b=>:B, :c=>:C}
berson = {:a=>:A1, :b=>:B1, :c=>:C1}

kerson = person.merge(berson) do | key, oldv, newv |
if key == :a
  return oldv
elsif key == :b
  return newv
else
  return key
end
end

puts kerson.inspect

以上代码的错误是:

unexpected return (LocalJumpError)

任何人都能解释一下吗?我认为return可以选择在任何已经假设返回值的地方使用。

1 个答案:

答案 0 :(得分:12)

错误的原因是块实际上没有自己返回的范围 - 从块返回等同于从周围方法返回。这里的周围方法是什么?没有 - 它位于顶层,所以它等同于执行ruby -e "return",它会给你同样的错误。如果你把它放在一个方法中,它将使该方法返回被执行的if子句的第一个分支的值。