Passing the class as an argument

D

Damphyr

I'm too lazy to figure it out (and a bit hangover).
I have several collections of objects (read over an OLE API) that I
transform to arrays of ruby objects.
Against the DRY religion I ended up with several methods similar to the
following:

def get_processors col
ar=Array.new
count=col.Count
1.upto(count){|i|
ar<<Processor.new(col.GetAt(i))
}
return ar
end

Now, this begs for the working equivalent of

def get_collection col, _class
ar=Array.new
count=col.Count
1.upto(count){|i|
ar<<_class.new(col.GetAt(i))
}
return ar
end

How do I do it?
(I do know how do it - I think . It's just that the hangover is not
helping the search functions of my brain :) )

i.e. this would do what I want
def get_collection col, _class
ar=Array.new
count=col.Count
1.upto(count){|i|
ar<<instance_eval(_class+".new(col.GetAt(i))")
}
return ar
end

...but, is there another way?
Cheers,
V.-
--
http://www.braveworld.net/riva

____________________________________________________________________
http://www.freemail.gr - äùñåÜí õðçñåóßá çëåêôñïíéêïý ôá÷õäñïìåßïõ.
http://www.freemail.gr - free email service for the Greek-speaking.
 
D

Damphyr

Damphyr said:
I'm too lazy to figure it out (and a bit hangover).
I have several collections of objects (read over an OLE API) that I
transform to arrays of ruby objects.
Against the DRY religion I ended up with several methods similar to the
following:

def get_processors col
ar=Array.new
count=col.Count
1.upto(count){|i|
ar<<Processor.new(col.GetAt(i))
}
return ar
end

Now, this begs for the working equivalent of

def get_collection col, _class
ar=Array.new
count=col.Count
1.upto(count){|i|
ar<<_class.new(col.GetAt(i))
}
return ar
end

How do I do it?
(I do know how do it - I think . It's just that the hangover is not
helping the search functions of my brain :) )

i.e. this would do what I want
def get_collection col, _class
ar=Array.new
count=col.Count
1.upto(count){|i|
ar<<instance_eval(_class+".new(col.GetAt(i))")
}
return ar
end

...but, is there another way?
And to clarify (it's just impossible to concentrate today :( ).
Ideally I would like to call

get_collection(ole_collection,Processor)

which looks nicer than

get_collection(ole_collection,"Processor")
Cheers,
V.-
--
http://www.braveworld.net/riva

____________________________________________________________________
http://www.freemail.gr - äùñåÜí õðçñåóßá çëåêôñïíéêïý ôá÷õäñïìåßïõ.
http://www.freemail.gr - free email service for the Greek-speaking.
 
D

David A. Black

Hi --

I'm too lazy to figure it out (and a bit hangover).
I have several collections of objects (read over an OLE API) that I transform
to arrays of ruby objects.
Against the DRY religion I ended up with several methods similar to the
following:

def get_processors col
ar=Array.new
count=col.Count

Are you sure you've got Count as a method name? It's possible, but
fairly bizarre.
1.upto(count){|i|
ar<<Processor.new(col.GetAt(i))
}
return ar
end

Now, this begs for the working equivalent of

def get_collection col, _class
ar=Array.new
count=col.Count
1.upto(count){|i|
ar<<_class.new(col.GetAt(i))
}
return ar
end

I guess col is 1-originating, so you'd have to adapt this, but here it
is with a normal array:

def get_collection(col, klass)
col.map {|e| klass.new(e) }
end

If klass is a string, you'd have to do a const_get on it first:

klass = Object.const_get(klass)

or the traditional deep version, if it's a nested constant:

class Module
def deep_const_get(c)
c.split("::").inject(self) {|acc,const| acc.const_get(const) }
end
end

or some variant thereof.


David
 
D

Damphyr

David said:
Hi --




Are you sure you've got Count as a method name? It's possible, but
fairly bizarre.
Yeap, we're not talking Ruby objects here. It's an OLE API and it uses
some pretty un-ruby names.
So col is an an OLE object missing such nice conveniences like each and
collect and map.
Well, assumptions can kill you. The following works as is, so all this
was a post with no reason to exist whatsoever.

class P
attr_reader :c
def initialize c
@c=c
end
def to_s
return @c
end
end
def get_collection col,_class
ar=Array.new
col.each{|e|
ar<<_class.new(e)
}
return ar
end

col=["w","o","w"]
ps=get_collection col,P
puts psw
o
w

If only everything turned out so easy...
V.-
--
http://www.braveworld.net/riva

____________________________________________________________________
http://www.freemail.gr - äùñåÜí õðçñåóßá çëåêôñïíéêïý ôá÷õäñïìåßïõ.
http://www.freemail.gr - free email service for the Greek-speaking.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,901
Latest member
Noble71S45

Latest Threads

Top