岡本です。

> > def foo( arg = nil )
> >     if arg != nil
> >         @memb = arg
> >     else
> >         arg = @memb
> >     end
> >     ......
> > end
> >
> > のようなコードを
> >
> > def foo( arg = @memb )
> >     @memb = arg
> >     ......
> > end
> >
> > と、より単純にかけるかな、と思ったからです。
>
>   これだと foo(nil) の動作が違いませんか。

そう言えばそうですね。

もともと、一旦作ったオブジェクトを initialize で再初期化しよう、という思い付きから
手をつけまして、

foo = Foo.new(50)
.....
foo.initialize(5)
......
foo.initialize

のように使って、引数が渡せば対応するメンバの値をその値で更新し、
引数を省略すればそのメンバの値を変えないようにしよう、と考えていました。
「引数がなければ」というのが頭にあって、明示的にnilを与えた時のことを考えて
なかったですね。
このアイデアも結局お蔵入りになったのですが、デフォルト引数に使える式の条件が気になった
もので投稿しました。

ようは呼ばれるメソッドのローカルなスコープの変数を使った任意の式が使えるんですね。
今試してみたら
def foo( arg = ( /str(ing)/=~"string"; $1) )
    p arg
end
foo()    =>"ing"
とかいう馬鹿なこともできました。