ブロック引数を理解しているなら、

class Proc

def initialize(&block)

@proc = block

end


def call(*args)

@proc.call(*args)

end

def [](*args)

call(*args)
end
end

で理解できるかな。
イテレータのブロックも実態は同じものだけど、振舞がちょっと違うので注意。