[#29374] nil.to_s — Shugo Maeda <shugo@...>

前田です。

59 messages 2006/09/01
[#29375] Re: nil.to_s — "U.Nakamura" <usa@...> 2006/09/01

こんにちは、なかむら(う)です。

[#29380] Re: nil.to_s — Yukihiro Matsumoto <matz@...> 2006/09/01

まつもと ゆきひろです

[#29387] Re: nil.to_s — Shugo Maeda <shugo@...> 2006/09/01

前田です。

[#29390] Re: nil.to_s — Yukihiro Matsumoto <matz@...> 2006/09/01

まつもと ゆきひろです

[#29398] Re: nil.to_s — "NARUSE, Yui" <naruse@...> 2006/09/01

成瀬です。

[#29400] Re: nil.to_s — Yukihiro Matsumoto <matz@...> 2006/09/01

まつもと ゆきひろです

[#29491] symbol and string — Tanaka Akira <akr@...>

open-uri で :proxy=>nil という指定を行うと、以下のようにエラーになります。

33 messages 2006/09/05
[#29499] Re: symbol and string — Yukihiro Matsumoto <matz@...> 2006/09/05

まつもと ゆきひろです

[#29500] Re: symbol and string — Tanaka Akira <akr@...> 2006/09/05

In article <1157470154.047826.13379.nullmailer@x31.priv.netlab.jp>,

[#29503] Re: symbol and string — Yukihiro Matsumoto <matz@...> 2006/09/06

まつもと ゆきひろです

[#29504] Re: symbol and string — Tanaka Akira <akr@...> 2006/09/06

In article <1157505538.340126.8472.nullmailer@x31.priv.netlab.jp>,

[#29507] Re: symbol and string — Yukihiro Matsumoto <matz@...> 2006/09/06

まつもと ゆきひろです

[#29512] Re: symbol and string — keiju@... (石塚圭樹) 2006/09/06

けいじゅ@いしつかです.

[#29529] Re: symbol and string — SASADA Koichi <ko1@...> 2006/09/08

 ささだです。

[#29530] Re: symbol and string — Yukihiro Matsumoto <matz@...> 2006/09/08

まつもと ゆきひろです

[ruby-dev:29407] Re: nil.to_s

From: Minero Aoki <aamine@...>
Date: 2006-09-02 09:00:04 UTC
List: ruby-dev #29407
青木です。

nil.to_s は "" 派で参戦します。

  In mail "[ruby-dev:29402] Re: nil.to_s"
  Shugo Maeda <shugo@ruby-lang.org> wrote:

> 前田です。

> > |Ruby でのルーズな tips として、
> > |その値が文字列か nil かわからないときに nil.to_s を使う、
> > |というのがあるかと思います。
> >
> > そうなんですか。
> 
> 残念ながら使っている人は多いです。
> 私も使っていると思います。

わたしも意識的に使ってます。「||」などで置き換えられるのは
わかりますが、to_s のほうがメソッドチェーンで書けるので便利
だし気持ちいいんです。前に戻って括弧をつけるのはめんどくさいし
見にくいです。


> > この人工的な例からnil.to_sが""であるべき理由を読み取ることは
> > できませんでした。この例は「存在しないキーに対して空文字列が
> > ほしい」ということなんだと思うんですが、そういう目的のために
> > Hashにはデフォルト値が用意されてますよね。
> 
> Hash以外にも引数などがnilかもしれない時に
> 
> def foo(x)
>   ... x.to_s ...
> end
> 
> とするようなケースがありますよね。
>
> x || ""の方が好ましいと思いますが、上記のようなコードも多い
> と思います。

わたしの書いた、実際に使っているコードから探してきた例だと
こんなのがありました。

def format(m, template)
  template.gsub(/%\w+/) {|key|
    case key
    when '%subject'
      m.subject.to_s.strip
    when '%from'
      m.friendly_from.to_s.sub(/@.*/, '@...').strip
    when '%body'
      Iconv.conv(@dest_encoding, (m.charset || 'iso-2022-jp'), m.body.to_s.strip)
    else
      raise ArgumentError, "unknown mail part name: #{key.inspect}"
    end
  }
end

このメソッドの to_s は全部 nil が "" に変換されることを
狙って使っています。


で、わたしの主張としては、nil.to_s は "" がいいと思います。
理由は以下の 3 点です。

  1. 互換性がなくなる (しかも影響が大きい)
  2. 代替として示された「||」を使う方法などは楽でも気持ちよくもない。
  3. まつもとさんの言う
     「『そのオブジェクトがどんなものであるか』がはっきり分かる文字列」
     というのは、まさに inspect が果たすべき役割だと思う
     (ので、to_s にそれを求めるのはおかしい)。

もし puts や printf での特別扱いがあるから nil.to_s は "nil"
にすべきだというのであれば、わたしも、その特別扱いのほうをむしろ
やめるべきだと思います。というか、あれは昔から嫌だなあと思ってま
した。今回の件には関係なく特別扱いはやめちゃいましょうと主張します。


さらに、どうしても nil.to_s == "" がだめなら次善の策として、
nil.to_s を定義しないことを主張します。

Object#to_s が定義されているから nil.to_s も必要、という主張も
されていますが、わたしはそれならむしろ Object#to_s を廃止すべき
だと思います。デバッグ用には inspect があれば十分ですし、すべての
オブジェクトが文字列に変換できるという根拠はないと思います。Ruby
1.9 で Object#to_a も消えたんですから、to_s も消しちゃえばいい
じゃないですか。

--
青木峰郎

In This Thread