Forum: Ruby Passing the class as an argument

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Cfdeff3ac35010e4de8f85d954f24f4a?d=identicon&s=25 damphyr (Guest)
on 2005-11-20 21:07
(Received via mailing list)
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
Cfdeff3ac35010e4de8f85d954f24f4a?d=identicon&s=25 damphyr (Guest)
on 2005-11-20 21:11
(Received via mailing list)
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 :( ).
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
1fba4539b6cafe2e60a2916fa184fc2f?d=identicon&s=25 dblack (Guest)
on 2005-11-20 21:27
(Received via mailing list)
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)
       c.split("::").inject(self) {|acc,const| acc.const_get(const) }
     end
   end

or some variant thereof.


David
Cfdeff3ac35010e4de8f85d954f24f4a?d=identicon&s=25 damphyr (Guest)
on 2005-11-21 01:53
(Received via mailing list)
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
This topic is locked and can not be replied to.