前田です。

まず、議論を簡単にするために、String(nil)の話とnil.to_sの話は分け
て考えませんか?
ここでは、String(nil)について考えたいと思います。

Yukihiro Matsumoto wrote:
> |> というわけで、
> |>   String(nil)  #=> TypeError
> |>   Integer(nil) #=> TypeError
> |>   Float(nl)    #=> TypeError
> |>   nil.to_s     #=> ""
> |>   nil.to_i     #=> 0
> |>   nil.to_f     #=> 0.0
> |> というあたりを希望します。
> |
> |私もこれが一番一貫性があって、かつ便利だと思います。
>
> うささんへのフォローでも書きましたが、少なくとも私には(より
> 広い範囲で見た時に)一貫性があるようには見えません。
> Object#to_sがあるのにString(nil)が失敗する点とか。

「一貫性がある」という表現はよくなかったかもしれません。
「一貫性があるように見える」というところでしょうか。

言語を設計する側から見ると一貫性がないように見えるかもしれません
が、その言語を使ってプログラムを読み書きする立場から見ると、わり
と一貫性があるように見えるような気がします。
たぶん、to_iが変換が期待されるかどうか微妙な局面で、とりあえず便
利そうな値に変換してしまうのに対して、Integerがそういう局面ではエ
ラーを出すので、Integer以外の他の型への変換でも同様の挙動を期待し
てしまうのではないかと思います。

> 便利かどうかはまた別の話ですが。
>
> ですから、どう一貫性があるのか、どう便利なのか、もうちょっと
> 突っ込んで議論していきたいです。

便利なのは、使う時にどちらを選ぶかの基準がわかりやすいところだと
思います。なるべくエラーにせずに何らかの値に変換してほしい時は
to_i系を使って、微妙な場合はエラーにしてほしい時はInteger()系を
使えばいいので。

-- 
前田 修吾