Frage Warum verursacht das Schlüsselwort return Probleme in meinem 'if block'?


Der folgende Code funktioniert einwandfrei:

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

aber wenn ich hinzufüge return Innerhalb des "if blocks" bekomme ich einen Fehler:

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

Der Fehler aus dem obigen Code ist:

unexpected return (LocalJumpError)

Kann das jemand erklären? ich dachte return kann optional überall dort verwendet werden, wo bereits die Annahme eines Rückgabewertes vorliegt.


5
2018-05-15 03:15


Ursprung


Antworten:


Der Grund für den Fehler ist, dass Blöcke nicht wirklich ihren eigenen Gültigkeitsbereich haben, aus dem sie zurückkommen - eine Rückgabe von einem Block entspricht der Rückkehr von der umgebenden Methode. Was ist die umgebende Methode hier? Es gibt keine - es ist auf der obersten Ebene, also ist es gleichwertig zu tun ruby -e "return", die Ihnen den gleichen Fehler geben wird. Wenn Sie dies innerhalb einer Methode festhalten, wird die Methode den Wert des ersten Zweigs der if-Klausel zurückgeben, die ausgeführt wird.


12
2018-05-15 04:20