How to call a class method when (i.e. in the moment of) inheritingfrom a class/defining a descendant

T

Thomas

Hi,

This problem maybe results from a bad understanding of what I'm trying
to do. Anyway, is it possible to call a method when creating a new class
or inheriting from another class?

Currently my code looks somehow like this:

class A
class << self
attr_reader :x

def prepare
# do something
end

def fixate
# do something
end

def foo(a)
# do something with a and @x
end
end
end

class B < A
prepare

@x = "something"

foo("bar")

def method1
# do something else
end

fixate
end

Now in an ideal world, the definition of class B would be simply:

class B < A
@x = "something"

def method1
# do something
end
end

and A.setup and A.fixate should be automagically invoked whenever
defining a descendant from class A.

Does somebody know a solution for how this can be done? The only
possible way of doing this I could come up with is to wrap the
definition part into a block and pass this block to a method that calls
these functions and evaluates the block using class_eval. Something in
the line of (untested):

class C < A
wrapper do
@x = "something"

def method1
# do something
end
end
end

But I'm not sure if this solution really is an advantage.

Cheers,
Thomas.
 
G

Gennady Bystritksy

You must keep in mind that a class instance variable is local for the
particular class object. In your case, trying to set @x in B does it
locally for class B, not affecting @x in class A in any way, even when B
inherits from A. You may want to define "attr_writer :x" in class A and
use "self.x = 'something'" in class B.

Gennady.
 
G

gabriele renzi

Thomas ha scritto:
Does somebody know a solution for how this can be done?

see Class#inherited:
"wow I got childs:A2"
=> nil"wow I got childs:#<Class:0x2bd54e0>"
=> #<Class:0x2bd54e0>
 
A

Ara.T.Howard

Hi,

This problem maybe results from a bad understanding of what I'm trying to do.
Anyway, is it possible to call a method when creating a new class or
inheriting from another class?

Currently my code looks somehow like this:

class A
class << self
attr_reader :x

def prepare
# do something
end

def fixate
# do something
end

def foo(a)
# do something with a and @x
end
end
end

class B < A
prepare

@x = "something"

foo("bar")

def method1
# do something else
end

fixate
end

Now in an ideal world, the definition of class B would be simply:

class B < A
@x = "something"

def method1
# do something
end
end

and A.setup and A.fixate should be automagically invoked whenever defining a
descendant from class A.

Does somebody know a solution for how this can be done? The only possible way
of doing this I could come up with is to wrap the definition part into a
block and pass this block to a method that calls these functions and
evaluates the block using class_eval. Something in the line of (untested):

class C < A
wrapper do
@x = "something"

def method1
# do something
end
end
end

But I'm not sure if this solution really is an advantage.

harp:~ > cat a.rb
class A
class << self
def setup
puts "<#{ self }> invoking setup..."
end
def inherited klass
klass.setup
end
end
end

class B < A
end

harp:~ > ruby a.rb
<B> invoking setup...

hth.

-a
--
===============================================================================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| My religion is very simple. My religion is kindness.
| --Tenzin Gyatso
===============================================================================
 
T

Thomas

class A
class << self
def setup
puts "<#{ self }> invoking setup..."
end
def inherited klass
klass.setup
end
end
end

class B < A
end

Thanks for this reference to "inherited" -- I didn't know about this
method and its purpose. As so often with ruby, the solution is somehow
self-evident/explanatory in retrospect.

Regards,
Thomas.
 

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,767
Messages
2,569,572
Members
45,045
Latest member
DRCM

Latest Threads

Top