まつもと ゆきひろです

少々ruby-devっぽい話題ですが,このままruby-listで.

In message "[ruby-list:7366] Re: Q: jcode.rb tr(String + nil)"
    on 98/04/08, 石塚圭樹 <keiju / Rational.Com> writes:

|けいじゅ@日本ラショナルソフトウェアです.

|>String#+とString#concatは「nilを受け付けるようにしようかなあ」
|>と思い始めてます.
|
|そうですね. そのぐらいはいいですかね...  Array#+/Array#concatでは許さ
|れていますしね.

Array#+やArray#concatは

  def +(obj)
    unless obj.kind_of? Array
      return self + obj.to_a
    end
    ...
  end

のようになってて,nil.to_aが[]を返すようになっている結果なの
でちょっと違うんですが.

|そうすると, nil == nil | false | [] | "" | 0 ってイメージになるのかな?

  nil.to_i => 0
  nil.to_s => ""
  nil.to_a => []

なのは確かですけど.どこででもそのように使って良いかっていう
とそうでもないと思います.実際,たとえばnil -> 0の変換は現状
では暗黙には行われませんから.

|今は, 論理演算(false) と +([],"",0), concat([],"")だけなのかな?

前述のようにArray#+とArray#concatは別とすると,現状では二項
演算子(または1引数のメソッド)で右辺のnilを特別扱いしているも
のはないはずです.いっそのこと,nilからの暗黙の変換は一切行
わない方が良いのかも知れません.String#+とかも含めて.

# さっきと言ってること違うんですけど

|どうせなら, 
|
|  nil.concat []or"" 
|  1 + nil
|
|も許します?

nil.concatっていうのはあんまり意味無いんではないでしょうか.
だってconcatって「レシーバに破壊的に追加」って意味ですけど,
nilには「追加」は出来ませんよね.

1+nilってのは今実装してみたんですけど,いろいろ考えるに必要
以上の暗黙の変換はバグの発見を遅らせるだけのように思うので,
これも止めとこうと思います.

となると後は

  nil + x

でxが整数,実数,文字列,配列の時はxを返す,という仕様はどう
なのか,ってことだけが残るんですが,これはこのままにしとこう
と思います.

# 実数や配列は外しても良いかも.

                                まつもと ゆきひろ /:|)