Polished Ruby Programming を読んでいる

ずっと興味のあった洋書の「Polished Ruby Programming」を Kindle で買った。英語の勉強も兼ねて少しずつ読んでいる。

Polished Ruby Programming: Build better software with more intuitive, maintainable, scalable, and high-performance Ruby code (English Edition)

自分の英語の読書スピードだと全てを読む前に飽きてしまいそうなので、目次を見て面白そうな順番で読むことにした。最初は「Chapter 4: Methods and Their Arguments」から。

以下面白そうなトピックの抜粋。

メソッドの引数は可能なら 0 にした方がよい

引数があるとパラメータの設定ミスが起こるので引数が不要なメソッドが一番分かりやすい。次点が1個で2つ以上になるととても難しくなるのでできるだけ引数の数は減らせるようにしよう。

実際に Ruby の Object も大半が 0 になっているのをコードを書いて確かめているのがよい。

h = Hash.new(0)
o = Object.new
o.methods.each do |m|
 h[o.method(m).arity] += 1
end
h
# => {0=>20, 1=>18, -1=>18, 2=>1}

Array, Hash, String も調べてみる。 -1 は可変長引数を受け付ける場合らしい。やはり 0 OR 1 がほとんどになっている。

def method_argument_count(t)
  h = Hash.new(0)
  o = t.new
  o.methods.each do |m|
   h[o.method(m).arity] += 1
  end
  h
end

method_argument_count(Array)
# => {0=>70, 1=>43, -1=>76, -2=>1, 2=>1}
method_argument_count(Hash)
# => {-1=>58, 0=>71, 1=>44, 2=>3}
method_argument_count(String)
# => {0=>67, -1=>71, 1=>41, -2=>2, 2=>8}

Ruby 引数の種類はたくさんある

Ruby の引数種類の詳しい説明は始めて見た。デフォルト引数前に置けるのね。

著者の Ruby を熟知した感じと好きな感じが端々から溢れていてとても楽しい。

callメソッドの糖衣構文

https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#call_method

Proc#call が実装済みなら以下で呼べるらしい。あんまり使われていないのは C++ みたいに.が省略できないからなんだろうなぁ。(筆者はそれもあって #[]をい使うことが多いとも書いてあった)

foo.(100)      # foo.call(100)と全く同じ意味
foo::(100)     # foo.call(100)と全く同じ意味

追記

ところで今なら日本語版の「研鑽Rubyプログラミング」が発売したばかりなのでそっちを買うのもおすすめです。

※ 実は自分もβ版買ってありました(すっかり忘れてた・・)