今日のきもいよ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と同じ動作をする。なんというかさ、便利なのかもしれないけど、同じ名前で、違う動作するのはちょっとあれだと思うんだ僕は。