Brincando com Ruby

5 09 2011

Buscando uma idéia para mudar o comportamento de uma classe em uma determinada situação, fiz alguns testes, incluindo o exemplo abaixo.


 class Pie
  def initialize(name, age)
    @name = name
    @age = age
  end
  def to_s
    @name
  end
  def age
    @age
  end
 end
 
 #Age is saved in seconds
 
 SECOND = 1
 MINUTE = 60 * SECOND
 HOUR = 60 * MINUTE
 DAY = 24 * HOUR
 WEEK = 7 * DAY
 
 
 first_pie = Pie.new "Torta de Ameixa da Vovo", 6000
 
 def using(unit, &block)
  Pie.class_eval { alias_method :original_age, :age }
  Pie.send :define_method, :age do
    original_age / (Kernel.const_get unit.to_s.upcase)
  end
  yield
  Pie.class_eval { alias_method :age, :original_age }
 end
 
 using :second do
  puts "Seconds: #{first_pie.age}"
 end
 
 using :minute do
  puts "Minutes: #{first_pie.age}"
 end
 
 using :hour do
  puts "Hours: #{first_pie.age}"
 end

Como é possível identificar, cada bloco altera o comportamento do método ‘age’.
A maneira não é segura, nem muito boa para ser usada em produção, pois se ocorrer algum erro, é provavel que o método original se perca, mas é uma ótima forma de saber como a linguagem possui alguns recursos bem interessantes.

Publicidade