yieldがよくわかないんですけど、次の2つの違いって何かありますか?

def foo1(arg)
yield(arg)
end

def foo2(arg, &block)
block.call(arg)
end

どちらも同じように思うのですが、もし同じならyieldを導入した意味は何でしょう?