From: Nathan Smith [mailto:nsmith5 / umbc.edu] 
> It's too bad Ruby does not allow overloaded methods. It makes 
> more sense,
> IMHO, in this case to have two constructors, each of which perform two
> different 'functions', rather than having if/else/case 
> statements inside
> the constructor with default arguments.

'Constructors' in ruby are just initializers that get run after the
internal 'new' allocates the object. The only thing special about
#initialize is that it happens to get called after you create a new
instance.

You can create as many different 'constructor' methods of the class as
you like. It's not parameter overloading, but (in my opinion) that's a
good thing.

class Circle
  attr_accessor :radius

  def initialize( radius )
    @radius = radius
  end

  def self.withradius( r )
    self.new( r )
  end

  def self.witharea( area )
    self.new( Math.sqrt( area / Math::PI ) )
  end

  def self.withcircumference( circumference )
    self.new( circumference / 2 / Math::PI )
  end
  
  def self.clone( circle )
    self.new( circle.radius )
  end

  def area
    Math::PI * @radius ** 2
  end

  def circumference
    2 * Math::PI * @radius
  end
end
  
p c1=Circle.new( 10 ),
  c2=Circle.witharea( 100 ),
  c3=Circle.withcircumference( 50 ),
  c4=Circle.clone( c1 )

#=> #<Circle:0x2833504 @radius=10>
#=> #<Circle:0x2832e60 @radius=5.64189583547756>
#=> #<Circle:0x2832c94 @radius=7.95774715459477>
#=> #<Circle:0x2832c08 @radius=10>