Re: ','.join() がなぜキモイのか

ref: http://d.hatena.ne.jp/methane/20090615/1245025996
よいまとめ。Ruby の Array#join は

  • 1. 自然言語の文法とあわないのがキモイ
  • 2. 勝手に型変換 (to_s) するのがキモイ
  • 3. 文字列べったりのメソッドが Array にあるのがキモイ
  • 4. Enumerable ではなく Array なのがキモイ

ということのようです。


1 については、ぼくに英語の感覚がないせいか、どっちでも特に違和感はないです *1Ruby というと英語風 DSL が有名ですが、Ruby 自体は英語文法とのアナロジーをそれほど意識してないと思います *2
2 と 3 については全くその通りで、Rubyist から見ても Array#join に違和感はあります (ぼくだけ?) 。
4 については、Enumerable#join は提案されたことがあるみたい (ruby-talk:143305) ですが、「Enumerable は無限列の場合もある」「Enumearble は順序が保証されない」というあたりが引っかかってうやむやになったみたいです。


違和感があっても Array#join がいいと思う理由は

Arrayのメソッドチェーンを作ってキモチイイと悦ぶ

に尽きます。配列をぐねぐねいじって最終的に join で文字列化するという処理は頻出だと思いますが、

ary.transpose.flatten(1).map { ... }.each_cons(2).map { ... }

まで書いて、いざ文字列化するというとき。Array#join だと

ary.transpose.flatten(1).map { ... }.each_cons(2).map { ... }.join(",")

と続けて書いて終わりですが、','.join だと

",".join(ary.transpose.flatten(1).map { ... }.each_cons(2).map { ... })

# または

ary = ary.transpose.flatten(1).map { ... }.each_cons(2).map { ... }
",".join(ary)

となり、面倒です。あと見通しも悪くなる。というわけで正しさより便利さですね。うーん、やっぱりぼくの意見は Rubyist 一般の意見ではないかも。


そういえば、「文字列はよく使うから特別」ということで Array#join が許されるなら「数もよく使うから特別」ということで Array#sum を許してほしい。

*1:RubyPython も元ネタは Perl の join かと思うんですが、Perl は join(区切り文字, 配列) ですね。英語ネイティブにとってはこの語順が自然なのかな。

*2:例えば Array#delete なんか説明が難しいと思います。「配列 delete (its elements that equal to) 引数」だろうか。それほど難しくなかった。