Ruby で階乗

初心のときにありがちな書き方は

def fact(n)
  if n == 0 then
    1
  else
    n * fact(n - 1)
  end
end

n が負のときどうするの、っていうのはとりあえず置いといて、まぁ再帰を知ってるのはいいことだけど、Ruby ならではのうまい書き方がある。

class Integer
  def !
    (1..self).inject(1, :*)
  end
end

puts 3.! # => 6
puts 0.! # => 1

既存のクラスに対してこういう書き方で自前のメソッドを追加できるのも Ruby の強み。