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

pez*_*ser 5 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
Run Code Online (Sandbox Code Playgroud)

但是如果我return在"if block"里面添加,我会收到一个错误:

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
Run Code Online (Sandbox Code Playgroud)

上面代码的错误是:

unexpected return (LocalJumpError)
Run Code Online (Sandbox Code Playgroud)

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

Chu*_*uck 12

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