From: "NARUSE, Yui" Date: 2006-09-03T09:30:55+09:00 Subject: [ruby-dev:29419] Re: nil.to_s 成瀬です。 > putsがnilを出力しないのは、あきらかに不便だと思います。私に > とっては天秤にかける内容ではないのですが。実際のところはそう > でもないのかな。 > 一般論として他の区別できない文字列表現は良くない [ruby-dev:29148] のスレッドでの Time#to_s の意味がようやくわかって きた気がします。まつもとさんは puts に p よりも目に優しいダンプを 期待していらっしゃるのですよね? そう考えると、to_s に関するまつもとさんの主張の趣旨が理解できそうです。 それを前提に整理し直すと to_s については、 * 目に優しいダンプ * エラー検出 * エラー無視 という互いに矛盾する立場が存在するのでしょうか。 > > to_sはprintで、inspectはpで使われる、というのがこれら二つの > > メソッドの違いです。逆に言えばそれ以上の明確な違いは定義され > > ていないわけですね。ですから「『そのオブジェクトがどんなもの > > であるか』がはっきり分かる文字列であるべき」というのは絶対条 > > 件ではありません。ただ、一般論として他の区別できない文字列表 > > 現は良くない(ので、従来のto_sのうちあまり望ましくないものが > > あった(arrayとかhashとか))とは思っています。 > > to_sにはそういう役割は期待していなかったので、この話にはちょっと > 驚きました。 わたしも to_s にそのようなダンプ的な意図があるとは知りませんでした。 さておき、puts / to_s に区別の機能を持たせるのは過剰と感じます。 区別は p / inspect が行うべきことで、現状が使いづらいのならば、 こちらをもっと見やすくするほうがよいかと思います。 あるオブジェクトが何者か見たいとき、p の方が短いですし。 よって、以下のような住み分けはいかがでしょう。 :to_s 文字列にしたとき一番便利な形式。 それを文字列にした時通常期待される形式。 :inspect それが何者であるかわかりやすい形式。 :to_yaml ダンプ。 このように定義すると、例えば Time の場合、 access_list = [ [ip_address, time], [ip_address, time], ... ] access_list.each{|item| puts '%s : %s' % item } とした時 "127.0.0.1 : 2006-07-27 16:16:33 +0900" でもアリな気がします。 puts [1,2] -> "1,2" puts :a=>1,:b=>2 -> "a=>1,b=>2" > いや、もともとあまり強い理由はないんです。ただ、nilにどんな > 意味を持たせるのか明確化したいだけで。 nil は例外の一種だと思っています。 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/7999 を見るともともと IndexError だったようですし。 あくまでエラー値であり、無というよりも悪意のこもった無だけれど、 強制的に変換した場合は、「なかったことにする」零元になる、とか。 > 将来定義されうるあらゆるto_xxxはnilから零元に変換されるべきだ、とか? > 直近だとcomplexやrationalの組み込みが予定されてますよね。 to_x については零元にされるべきですが、to_xxx についてはわかりません。 * CLASS.new(nil) -> 例外 * nil.to_xxx -> 例外 ? * CLASS(nil) -> 零元 ? * nil.to_x -> 零元 とりあえずリストにするとこんな感じでしょうか。 -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA