Multiple constructors?

Hi,

Is it possible to use multiple constructors in Ruby?

class SQLServerConnection

  def initialize(server_name, db)

  end

  def initialize(server_name, db, user_name, password)

  end
end

Thank You

Aidy

You can send your initialize an array or hash, or you can do

class C
  def initialize( a, b, *c )
    #verify and do stuff
  end
end

hth,
Todd

···

On Wed, Jul 23, 2008 at 12:09 PM, aidy <aidy.lewis@googlemail.com> wrote:

Hi,

Is it possible to use multiple constructors in Ruby?

class SQLServerConnection

def initialize(server_name, db)

end

def initialize(server_name, db, user_name, password)

end
end

First of all initialize is not a constructor but an initializer,
behind the scenes the following happenes

class Object
   def self.new *args, &blk
        o = allocate
        o.send :initialize, *args, &blk # this because #initialize is
*always* private
        o
   end
end

As you can see #initialize is an instance method and #new is a
singleton (or class) method.

Secondly, and that holds for all methods, #initialize is only an
example, you cannot "overload" method definitions but simulate that
behavior, in your case I would do the following

class SQLServerConnection

   private

   def initialize *args
      case args.size
      when 2
         init_name_db *args
      when 4
        init_user_pw *args
     else
      error
    end
end

   def init_name_db server_name, db
    ...
   end

  def init_user_pwd server_name, db, user, pwd
   ...
  end
end

HTH
Robert

···

On Wed, Jul 23, 2008 at 7:09 PM, aidy <aidy.lewis@googlemail.com> wrote:

Hi,

Is it possible to use multiple constructors in Ruby?

class SQLServerConnection

def initialize(server_name, db)

end

def initialize(server_name, db, user_name, password)

end
end

Thank You

Aidy

--
http://ruby-smalltalk.blogspot.com/

There's no one thing that's true. It's all true.
--
Ernest Hemingway

No, but you can have optional parameters by giving a default value or taking a hash.

   def initialize(server_name, db, user_name=nil, password=nil)
     if user_name && password
       # connect with credentials
     else
       # connect anonymously
     end
   end

Called like: SQLServerConnection.new("myserver", "development", 'aidy', 'shh_secret')

-or-

   def initialize(server_name, db, options={})
     if options.has_key?(:user) && options.has_key?(:password)
       # connect with credentials
     else
       # connect anonymously
     end
   end

and called like: SQLServerConnection.new("myserver", "development", :user => 'aidy', :password => 'shh_secret')

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com

···

On Jul 23, 2008, at 1:09 PM, aidy wrote:

Hi,

Is it possible to use multiple constructors in Ruby?

class SQLServerConnection

def initialize(server_name, db)

end

def initialize(server_name, db, user_name, password)

end
end

Thank You

Aidy

aidy wrote:

Is it possible to use multiple constructors in Ruby?

No.

class SQLServerConnection
def initialize(server_name, db)

end
def initialize(server_name, db, user_name, password)

end
end

def initialize(server_name, db, user_name=nil, password=nil)

end

HTH,
Sebastian

···

--
Jabber: sepp2k@jabber.org
ICQ: 205544826

I prefer to use different names for "different constructors".
Most of the time, I feel that overloading can complicate things,
more-so in a dynamic language.

Just make them class methods:

Foo.from_x()
Foo.with_size()

Etc, etc.

HTH,
Paul