結婚式のときにとちさんからお祝いで頂いていたパーフェクトRubyですが、パラパラとめくりながら時々読んでいたのですが、ちゃんと読んでみようと思って読んでみると、俺Rubyのことわかってなかったと痛感した。
特に、Enumerableのところでした。配列とハッシュは頻繁に使うのですが、each, map, inject, find, selectとかをよく使っていたのですが、さらに色々便利なメソッドがあるのだなー…。便利じゃないか?と思ったメソッド群はこちら。
array = [2,2,3,4,4,5]
array.select {|n| n.even? } # => [2, 2, 4, 4]
array.reject {|n| n.even? } # => [3, 5]
逆もできたんだな!と(まぁ条件を逆にすればいいだけではあるけど)。
%w(Alice Bob Charlie).grep(/a/i) # => ["Alice", "Charlie"]
["a", "b", 1, 2].grep(String) # => ["a", "b"]
今までselect内で正規表現チェックしていた気がする。
array = ["a", "b", "c", "d", "e"]
array.take(3) # => ["a", "b", "c"]
array.drop(3) # => ["d", "e"]
array.slice(0..2)ってやってた。まぁどっちでもできるんだけれど。
dropはいいですね。
array = [1, 2, 3, 4, 5]
array.take_while {|n| n < 3 } # => [1, 2]
array.drop_while {|n| n < 3 } # => [3, 4, 5]
今のところあんまり使う機会はなさそうだけれど。
array = [1, 2, 3, 1.0, 2.0, 3.0, "a", "b", "c"]
array.group_by {|v| v.class } # => {Fixnum=>[1, 2, 3], Float=>[1.0, 2.0, 3.0], String=>["a", "b", "c"]}
これはコードレビューで見たことあった。使ったことはない。
array = [1, 2, 3, 4, 5]
array.partition {|n| n.even? } # => [[2, 4],[1, 3, 5]]
selectとrejectを同時にできるのはいいなと思った。
array = [1, 2, 3, 4, 5]
array.min # => 1
array.max # => 5
array.minmax # => [1, 5]
minとmaxは知っていたけれど、minmaxは知らなかった!
array = ["a", "bb", "ccc"]
array.min_by {|n| n.length } # => "a"
array.max_by {|n| n.length } # => "ccc"
array.minmax_by {|n| n.length } # => ["a", "ccc"]
min_byとかあったんだなー…。
パーフェクトRubyは、正直俺はまだまだRubyとRailsの上辺だけを使っていたのだなと考えさせられる本でした。もっとRubyを使いこなせるようになりたい!と思ったので、Rubyもっと書きます。Rakeとかもっとちゃんと活用したい。gemを自分で書いていきたい。