Passing the class as an argument


#1

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 :slight_smile: )

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


#2

Damphyr wrote:

    ar<<Processor.new(col.GetAt(i))
    ar<<_class.new(col.GetAt(i))
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 :frowning: ).
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


#3

Hi –

On Mon, 21 Nov 2005, Damphyr wrote:

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.

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.split("::").inject(self) {|acc,const| acc.const_get(const) }
end
end

or some variant thereof.

David


#4

David A. Black wrote:

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 ps

w
o
w

If only everything turned out so easy…
V.-

http://www.braveworld.net/riva