extend an object using string as module name?

A

ako...

hello,

is this a proper way to do it:

name = 'MyModule'
o = Object.new
o.extend(Module.const_get(name))


are there better ways?

thanks
konstantin
 
A

ara.t.howard

hello,

is this a proper way to do it:

name = 'MyModule'
o = Object.new
o.extend(Module.const_get(name))


are there better ways?

this will fail for "ModuleA::ModuleB". for that you need something like:

#
# creates a class by class name
#
def klass_stamp(hierachy, *a, &b)
#--{{{
ancestors = hierachy.split(%r/::/)
parent = Object
while((child = ancestors.shift))
klass = parent.const_get child
parent = klass
end
klass::new(*a, &b)
#--}}}
end

this will work for

m = klass_stamp "A::B::C::Module"
o = Object::new
o.extend m

it's in alib.rb btw.

hth.

-a
--
===============================================================================
| ara [dot] t [dot] howard [at] noaa [dot] gov
| all happiness comes from the desire for others to be happy. all misery
| comes from the desire for oneself to be happy.
| -- bodhicaryavatara
===============================================================================
 
R

Ross Bamford

hello,

is this a proper way to do it:

name = 'MyModule'
o = Object.new
o.extend(Module.const_get(name))

I don't know if this is the proper way, but you could just eval the name:

name = 'MyModule'
o = Object.new
o.extend( eval name )

Or alternatively:

eval("o.extend #{name}")
 
M

Mauricio Fernández

this will fail for "ModuleA::ModuleB". for that you need something like:

#
# creates a class by class name
#
def klass_stamp(hierachy, *a, &b)
#--{{{
ancestors = hierachy.split(%r/::/)
parent = Object
while((child = ancestors.shift))
klass = parent.const_get child
parent = klass
end
klass::new(*a, &b)
#--}}}
end

def klass_stamp(name, *a, &b)
name.split(/::/).inject(Object){|s,x| s.const_get(x)}.new(*a,&b)
end

class A; class B; def foo; "A::B#foo" end end end
klass_stamp("A::B").foo # => "A::B#foo"
this will work for

m = klass_stamp "A::B::C::Module"
# ^
# that would try to instantiate the module
m = "A::B::C::Module".split(/::/).inject(Object){|s,x| s.const_get(x)}
o = Object::new
o.extend m

PS: have you seen http://eigenclass.org/hiki.rb?Usable+Ruby+folding+for+Vim ?
It might be of interest to you if you often use manual markers for
methods...
 
T

Trans

require 'facet/kernel/constant'

name = 'MyModule'
o = Object.new
o.extend(constant(name))

T.
 
A

ara.t.howard

require 'facet/kernel/constant'

name = 'MyModule'
o = Object.new
o.extend(constant(name))

T.

we have dueling libraries tom! ;-)

guess the fact that we are both writing these function over and over means
they are useful.

cheers.

-a
--
===============================================================================
| ara [dot] t [dot] howard [at] noaa [dot] gov
| all happiness comes from the desire for others to be happy. all misery
| comes from the desire for oneself to be happy.
| -- bodhicaryavatara
===============================================================================
 

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,484
Members
44,906
Latest member
SkinfixSkintag

Latest Threads

Top