Ruby Magic: Metaprogramming

Tuesday, September 5, 2006

Rails, if you’ve used it, has a rather elegant way of manipulating time. Stuff like 1.hours and 2.minutes.from_now just work. Let’s see how Ruby modules can be extended really really easily:

#! /usr/bin/env ruby

class Integer
  def seconds
    self
  end
  
  def minutes
    seconds * 60
  end
  
  def hours
    minutes * 60
  end
  
  def days
    hours * 24
  end
  
  def months
    days * 30
  end
  
  def years
    months * 12
  end
  
  def from_now
    Time.now + self
  end
  
  def before
    Time.now - self
  end
end

class String
  def palindrome?
    self == self.reverse
  end
end

class Time
  def leap_year?
    (year % 4).zero? and ((not (year % 100).zero?) or (year % 1000).zero?)
  end
end

class TrueClass
  def say
    "is"
  end
end

class FalseClass
  def say
    "is not"
  end
end

#2 is an Integer
puts 2.minutes.from_now

#"vishnu" is a String
puts "vishnu".palindrome?
puts "malayalam".palindrome?

puts 2.years.from_now.leap_year?

#Check if n years before is a leap year
puts "How many years before?"
year = Integer(readline)
puts "#{Time.now.year - year} #{year.years.before.leap_year?.say} a leap year." 

The interesting thing about Ruby is not that metaprogramming is possible, but Ruby makes it really easy to do it.

Tags:

| Permalink

1 Comment »

  1. Drug phentermine….

    Phentermine diet pills….

    Trackback by Cheapest phentermine. — Saturday, 10 May 2008 @ 01:27:11

RSS feed for comments on this post. TrackBack URI

Leave a comment