今日のきもいよRubyさん

きもいといっても、僕があんまり使っていない機能を使おうとしたら、僕が思った動作をしなかったというだけですが。

まずは、Arrayのdelete。配列の要素を削除して、それをjoinしようとして、

a.delete("").join(" ")

とかやろうとしたんだけど、

NoMethodError: undefined method `join' for "":String
        from (irb):2

となった。

Rubyリファレンスマニュアル - Arrayをみると、どうやらdeleteは、削除に成功した場合は削除した要素(正確にはdeleteの引数)を、失敗したらnilまたは、ブロックがあったらそれを評価して返すらしい。僕がやりたいようにやるには、delete_ifを使って、

a.delete_if{|e| e==""}.join(" ")

となる。なんか、個人的に嫌。まず、deleteが!がついていないのに破壊的というのも、破壊的操作は!と覚えていた僕にはキモイんだけど、まぁ、そっちのほうが便利なんだろうし、concatも破壊的だから、対象とれているからいいかと思うんだけど、deleteがselfを返さずに、削除できたかどうかの判定につかえるような値を返すのは、なんか許せないなぁ。メソッドチェーンに使いづらいし。別にゴルファーじゃないんだけど、なんかメソッドチェーンでどんどん書くのが、僕の中でのRubyチックな書き方なもんで。

あと、これ調べるついでに、のっているメソッド見ていたんだけど、"*"の動作もちょっと気持ち悪い。 

irb(main):009:0> b=(1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
irb(main):010:0> b * 2
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
irb(main):011:0> b
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
irb(main):012:0> b * 3
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

引数に数字がくると、配列をその分繰り返すんですが、文字列がくると

irb(main):013:0> b * ":"
=> "1:2:3:4:5:6:7:8:9:10"
irb(main):014:0> b * "to"
=> "1to2to3to4to5to6to7to8to9to10"

と、joinと同じ動作をする。なんというかさ、便利なのかもしれないけど、同じ名前で、違う動作するのはちょっとあれだと思うんだ僕は。