Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Generation of initialize

Reply
Thread Tools

Generation of initialize

 
 
arcadiorubiogarcia@gmail.com
Guest
Posts: n/a
 
      10-13-2007
Hi everyone,

I'm new to Ruby. I'm looking for an elegant solution to a simple
problem.

I have some classes like this one in my code:


class A

attr_reader :a1, a2

def initialize(a1, a2)
@a1 = a1
@a2 = a2
end

end


I'm looking for a way in order not to have to define the initialize
method in each class. Struct doesn't fit my needs since due to single
inheritance I can't have any other superclass, and I would like to.

Any suggestions?

Thanks in advance.

 
Reply With Quote
 
 
 
 
Trans
Guest
Posts: n/a
 
      10-13-2007


On Oct 13, 5:20 am, (E-Mail Removed) wrote:
> Hi everyone,
>
> I'm new to Ruby. I'm looking for an elegant solution to a simple
> problem.
>
> I have some classes like this one in my code:
>
> class A
>
> attr_reader :a1, a2
>
> def initialize(a1, a2)
> @a1 = a1
> @a2 = a2
> end
>
> end
>
> I'm looking for a way in order not to have to define the initialize
> method in each class. Struct doesn't fit my needs since due to single
> inheritance I can't have any other superclass, and I would like to.
>
> Any suggestions?


You could create an attr_initializer, something like:

module MyInitSystem
# extend hack
def self.included(base)
base.extend ClassMethods
end

module ClassMethods
attr_reader :attr_initializers
def attr_initializer(*args)
@attr_initializers ||= []
@attr_initializers.concat(args)
attr_reader *args
end
end

def initialize(*args)
self.class.attr_initializers.each_with_index do |a,i|
instance_variable_set("@#{a}", args[i])
end
end
end

class A
include MyInitSystem

attr_initializer :a, :b
end

Albeit, I'd use a hash to populate my object by var name.

T.


 
Reply With Quote
 
 
 
 
Ashley Moran
Guest
Posts: n/a
 
      10-13-2007
On Oct 13, 2007, at 1:20 pm, http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> Hi everyone,
>
> I'm new to Ruby. I'm looking for an elegant solution to a simple
> problem.
>
> I have some classes like this one in my code:
>
>
> class A
>
> attr_reader :a1, a2
>
> def initialize(a1, a2)
> @a1 = a1
> @a2 = a2
> end
>
> end
>
>
> I'm looking for a way in order not to have to define the initialize
> method in each class. Struct doesn't fit my needs since due to single
> inheritance I can't have any other superclass, and I would like to.
>
> Any suggestions?
>
> Thanks in advance.
>
>


Hi

Don't know if this has been done before, but here's a quick stab I
took at it:

require 'generator'

module InitializesWith
def initializes_with(*params)
define_method :initialize do |*args|
iterator = SyncEnumerator.new(params, args)
iterator.each do |param, arg|
instance_variable_set "@#{param}", arg
end
end
end
end

class Class
include InitializesWith
end

class C
attr_reader , :y, :z
initializes_with , :y, :z
end

obj = C.new(1,2,3)

obj.x # => 1
obj.y # => 2
obj.z # => 3


Any good?

Ashley


--
blog @ http://aviewfromafar.net/
linked-in @ http://www.linkedin.com/in/ashleymoran
currently @ home


 
Reply With Quote
 
arcadiorubiogarcia@gmail.com
Guest
Posts: n/a
 
      10-13-2007
Thank you both for your replies.

Just a minor detail regarding:

> require 'generator'
>
> module InitializesWith
> def initializes_with(*params)
> define_method :initialize do |*args|
> iterator = SyncEnumerator.new(params, args)
> iterator.each do |param, arg|
> instance_variable_set "@#{param}", arg
> end
> end
> end
> end
>
> class Class
> include InitializesWith
> end
>


This:

> class C
> attr_reader , :y, :z
> initializes_with , :y, :z
> end


evaluates to a Proc object, due to initializes_with implementation. I
guess it would be better to return nil at the end. Just a minor
aesthetic detail as I said.

 
Reply With Quote
 
Trans
Guest
Posts: n/a
 
      10-13-2007


On Oct 13, 7:55 am, (E-Mail Removed) wrote:
> Thank you both for your replies.
>
> Just a minor detail regarding:
>
>
>
> > require 'generator'

>
> > module InitializesWith
> > def initializes_with(*params)
> > define_method :initialize do |*args|
> > iterator = SyncEnumerator.new(params, args)
> > iterator.each do |param, arg|
> > instance_variable_set "@#{param}", arg
> > end
> > end
> > end
> > end

>
> > class Class
> > include InitializesWith
> > end

>
> This:
>
> > class C
> > attr_reader , :y, :z
> > initializes_with , :y, :z
> > end

>
> evaluates to a Proc object, due to initializes_with implementation. I
> guess it would be better to return nil at the end. Just a minor
> aesthetic detail as I said.


Return the attributes instead and you can do:

class C
attr_reader *initializes_with(, :y, :z)
end

T.


 
Reply With Quote
 
Brian Adkins
Guest
Posts: n/a
 
      10-13-2007
On Oct 13, 8:19 am, (E-Mail Removed) wrote:
> Hi everyone,
>
> I'm new to Ruby. I'm looking for an elegant solution to a simple
> problem.
>
> I have some classes like this one in my code:
>
> class A
>
> attr_reader :a1, a2
>
> def initialize(a1, a2)
> @a1 = a1
> @a2 = a2
> end
>
> end
>
> I'm looking for a way in order not to have to define the initialize
> method in each class. Struct doesn't fit my needs since due to single
> inheritance I can't have any other superclass, and I would like to.


Are you looking for something like the following?

class A
auto_attr_reader :a1, :a2
end

a = A.new 7,8
puts a.a1 # -> 7
puts a.a2 # -> 8

You mentioned both wanting to be able to inherit from another class
and that you don't want to define initialize, so will all of the
classes you wish to inherit from not need initialization?

 
Reply With Quote
 
Ashley Moran
Guest
Posts: n/a
 
      10-13-2007

On Oct 13, 2007, at 5:00 pm, Trans wrote:

> class C
> attr_reader *initializes_with(, :y, :z)
> end


Very clever


--
blog @ http://aviewfromafar.net/
linked-in @ http://www.linkedin.com/in/ashleymoran
currently @ home



 
Reply With Quote
 
Erik Veenstra
Guest
Posts: n/a
 
      10-13-2007
It can be as simple as this.

gegroet,
Erik V. - http://www.erikveen.dds.nl/

----------------------------------------------------------------

class Class
def generate_initialize(*vars)
define_method(:initialize) do |*args|
vars.zip(args) do |var, arg|
instance_variable_set("@#{var}", arg)
end
end
end
end

class Foo
generate_initialize :a, :b, :c
end

p Foo.new(1, 2, 3)

----------------------------------------------------------------


 
Reply With Quote
 
Brian Adkins
Guest
Posts: n/a
 
      10-13-2007
On Oct 13, 4:01 pm, Erik Veenstra <(E-Mail Removed)> wrote:
> It can be as simple as this.
>
> gegroet,
> Erik V. -http://www.erikveen.dds.nl/
>
> ----------------------------------------------------------------
>
> class Class
> def generate_initialize(*vars)
> define_method(:initialize) do |*args|
> vars.zip(args) do |var, arg|
> instance_variable_set("@#{var}", arg)
> end
> end
> end
> end
>
> class Foo
> generate_initialize :a, :b, :c
> end
>
> p Foo.new(1, 2, 3)


Might as well define the attrs while you're at it so you can get the
data out

 
Reply With Quote
 
arcadiorubiogarcia@gmail.com
Guest
Posts: n/a
 
      10-31-2007
Hi again,

I'm trying to enhance the previous solution (shown again at the end).
I'd like to call the initialize method of the superclass from the
generated initialize. For the moment it's ok to call it without
parameters. Simply placing super inside the method definition doesn't
work. Can anyone explain me how to do it. Thanks in advance.

def initialize_with(*params)
define_method(:initialize) do |*args|
if args.size != params.size then
raise ArgumentError.new("wrong number of arguments"\
" (#{args.size} for #{params.size})")
end
params.zip(args) do |param, arg|
instance_variable_set("@#{param}", arg)
end
end
return params
end

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How do you initialize signals in VHDL? Madhu VHDL 7 05-28-2008 06:43 PM
if instance variable get initialize after assigning some values or after constructor then when does static variable get initialize Tony Morris Java 3 02-04-2006 08:39 AM
Initialize array using file i/o procedure/function? Brandon VHDL 5 09-29-2005 05:32 PM
initialize memory units Daniel Koethe VHDL 1 11-08-2004 08:36 PM
HTML Generation (Next Generation CGI) John W. Long Ruby 4 11-24-2003 04:24 AM



Advertisments