ref: http://d.hatena.ne.jp/methane/20090615/1245025996
よいまとめ。Ruby の Array#join は
- 1. 自然言語の文法とあわないのがキモイ
- 2. 勝手に型変換 (to_s) するのがキモイ
- 3. 文字列べったりのメソッドが Array にあるのがキモイ
- 4. Enumerable ではなく Array なのがキモイ
ということのようです。
1 については、ぼくに英語の感覚がないせいか、どっちでも特に違和感はないです *1 。Ruby というと英語風 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 を許してほしい。