def foo
puts "in foo"
s = yield
puts "s = #{s}"
return 2
ensure
puts "in ensure"
return 1
end
def bar
foo do
puts "in bar block"
return 3
end
return 4
end
[36] pry(main)> r = bar
in foo
in bar block
in ensure
=> 4
Spodziewałbym się r = 3, ale okazało się, że jest to r = 4. Jeśli usunę kod zabezpieczający, oczekiwane jest r = 3. Dlaczego to jest?Zwrot ruby w bloku bloku wywoływanym z metody z zapewnieniem
def foo
puts "in foo"
s = yield
puts "s = #{s}"
return 2
end
r = bar
in foo
in bar block
=> 3
Ten [blog] (http://railsware.com/blog/2012/11/20/yield-gotcha-in-ruby-blocks/) próbuje ci wyjaśnić ... co się dzieje ... –