パーフェクトRuby Advent Calendar 2013(13日目) 気になるあの子

パーフェクトRuby Advent Calendar 2013 の13日目の記事です。
12日目の記事は パーフェクトRubyから泣く泣く削った標準添付ライブラリ パーフェクトRuby Advent Calendar 2013(12日目) です。

今日は、私がパーフェクトRubyを読んで思ったこと、気付いたことを書きます。

あの子にこんな一面も

パーフェクトRubyは、Rubyの言語仕様から丁寧に書いてある本なので、普段仕事でRubyを使っている私は「最初の方はだいたい知っている事なはず」と思っていました。 でもおさらい的な気持ちで読むと、あれ、これ知らなかったぞ…ということに結構出くわします。

私が特に「へー!」と思ったのは ブロックの do…end{}のちがいです。どちらを使っても同じだけど、複数行になるときは do…end 1行で書けるときは{}と覚えていました。 でも結合の優先度がちがうんですね。

{}の方が強く結合する

p [1, 2, 3].map {|n| n * 2 }
=> [2, 4, 6]

p [1, 2, 3].map do |n|
  n * 2
end
=> [1, 2, 3]

へー!
こういう知らなかったことに、たびたび出会えるのがとても嬉しいです。
あの子にこんな一面もあったんだ、と思う時のあの感じです。

身元が気になる

Moduleクラスっていうのを今まであまり意識していなかったのですが、なにげなく使っている attr_accessor とか include とかって Moduleクラスのメソッドなんですよね。パーフェクトRubyを読んでから「これModuleクラスのメソッド」って思うようになりました。

パーフェクトRuby読んで「そこ?」って感じかもですが、Object とか Kernel とかのメソッドもそうで、今まで気にせず使っていた子たちの身元が気になりだしました。

意識せず なにげなく使っていたものもあるし、もちろん新しく知ったメソッドもあります。 特に一覧を返す系のメソッドがすきです。

ancestors :祖先クラスとモジュールの一覧を返す

Class.ancestors #=> [Class, Module, Object, Kernel, BasicObject]

constants :定数名の一覧を返す

module IncludeModule
  MODULE_CONST_VAR = 1
end

class Constants
  include IncludeModule

  CLASS_CONST_VAR = 1
end

Constants.constants #=> [:CLASS_CONST_VAR, :MODULE_CONST_VAR]

とかとか。ふとした時に便利です。

前からObject#methodsもすきだったし、私は把握したいのかもしれないです。ちょっと高い位置から見渡したい。 そんな深層心理なのかもしれないです。

エピローグ

Rubyともっと仲良くなりたいと思いながら2年くらいやってきて、近づいたり、突き放されたり (被害妄想) しながら それでも少しずつ距離を縮めてきました。
パーフェクトRubyは たぶん私達の仲を取り持ってくれる存在だと思います。 これからもちょー頼りにしています。