Раньше я уже приводил некоторые примеры на Ruby и того, что все что есть в Ruby – есть объекты.

Почему бы нам не написать простейший метод вычисления факториала?

В Java мы, пожалуй, написали бы что-то типа:

MathUtils.factorial(5);

Вообще, должен заметить, что в Java постоянно приходится писать такие вспомогательные классы (в нашем проекте полно *Manager классов). На эту тему есть интересная статья Steve Yegge.

Почему бы нам не поступить наоборот?

5.factorial

Кусок кода, возращающий факториал от числа. Разве не это лучше всего ложится в концепцию ООП?

Но так как такого метода не существует в классе Fixnum нам придется немного “пометапрограммировать” и написать следующий кусок:

class Fixnum
  def fact(n)
    if n.zero?
      1
    else
      n*fact(n-1)
    end
  end

  self.module_eval do
    define_method :factorial do
      fact(self)
    end
  end
  private :fact
end

Все что здесь делается – это лишь добавление метода “factorial” к классу Fixnum во время выполнения программы.

Таким образом я могу написать

puts 6.factorial

и получить в результате: 720.
Метапрограммирование в Ruby предоставляет широкие возможности для разработчика, чем успешно и пользуются в Ruby on Rails.

Advertisements