Ruby の yield

yield が今ひとつわからなくてぐぐっていたら、良記事を発見。
Ruby の yield って結局なんなの? - YNote

それでも yield は複雑。再帰させるとむずかしい。例えば

class A
  def initialize
    @c = 1 
  end
  
  def each
    yield(@c)
    @c += 1
    self.each {|x| print "-- #{x}  "; yield(x)} 
  end
end

a = A.new
a.each {|i| print "\n#{i}\n"; break if i > 4}

というコードを自分で書いてみたが、結果が

1
-- 2
2
-- 3  -- 3
3
-- 4  -- 4  -- 4
4
-- 5  -- 5  -- 5  -- 5
5

となるのが自分でもよくわからない。yield はその時点での暗黙の proc オブジェクトを呼び出すので、上のようなコードだと、途中で暗黙の proc オブジェクトが変ってくるようだ。何だか不思議。