Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

0 views
Skip to first unread message

Thomas

unread,
Jun 6, 2005, 10:59:17 AM6/6/05
to
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.

gabriele renzi

unread,
Jun 6, 2005, 11:38:33 AM6/6/05
to
Thomas ha scritto:

> Does somebody know a solution for how this can be done?

see Class#inherited:

>> class A
>> def self.inherited(klass)
>> p "wow I got childs:"+klass.to_s
>> end
>> end
=> nil
>> class A2 < A
>> end
"wow I got childs:A2"
=> nil
>> Class.new(A2)
"wow I got childs:#<Class:0x2bd54e0>"
=> #<Class:0x2bd54e0>

Gennady Bystritksy

unread,
Jun 6, 2005, 11:38:19 AM6/6/05
to
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.

Ara.T.Howard

unread,
Jun 6, 2005, 11:40:52 AM6/6/05
to

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
===============================================================================

Thomas

unread,
Jun 7, 2005, 3:21:17 AM6/7/05
to
> 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.

0 new messages