From: Andrew Wagner on
[Note: parts of this message were removed to make it a legal post.]

I'm pretty new to ruby, and just playing around. I can't work out why the
following won't work, though:

1. module TrackInheritors
2. def self.extended(parent)
3. class << parent
4. puts self
5. @@inheritors = []
6.
7. def self.inheritors
8. @@inheritors
9. end
10.
11. def self.inherited(child)
12. @@inheritors << child
13. end
14. end
15. end
16. end
17.
18. class Parent
19. extend TrackInheritors
20. end
21.
22. class Child1 < Parent
23. end
24.
25. class Child2 < Parent
26. end
27.
28. puts Parent.inheritors
29.
30. # -:28: undefined method `inheritors' for Parent:Class
(NoMethodError)

From: cppcodeguy on

I'm a noob myself so sorry if I give incorrect information but I think you have a going out of scope issue. The inheirtors method is defined within the class that starts on line 3. However, the class it's put in is inside the extended method on line 2, so what I think is going on is that by the time you're trying to the inheirtors method, its class has already gone out of scope since it's called after the extended method has ended.




-----Original Message-----
From: Andrew Wagner <wagner.andrew(a)gmail.com>
To: ruby-talk ML <ruby-talk(a)ruby-lang.org>
Sent: Sun, Jul 25, 2010 9:48 pm
Subject: Beginning meta-programming question


I'm pretty new to ruby, and just playing around. I can't work out why the

following won't work, though:



1. module TrackInheritors

2. def self.extended(parent)

3. class << parent

4. puts self

5. @@inheritors = []

6.

7. def self.inheritors

8. @@inheritors

9. end

10.

11. def self.inherited(child)

12. @@inheritors << child

13. end

14. end

15. end

16. end

17.

18. class Parent

19. extend TrackInheritors

20. end

21.

22. class Child1 < Parent

23. end

24.

25. class Child2 < Parent

26. end

27.

28. puts Parent.inheritors

29.

30. # -:28: undefined method `inheritors' for Parent:Class

(NoMethodError)






From: Jesús Gabriel y Galán on
On Mon, Jul 26, 2010 at 6:48 AM, Andrew Wagner <wagner.andrew(a)gmail.com> wrote:
> I'm pretty new to ruby, and just playing around. I can't work out why the
> following won't work, though:
>
>   1.  module TrackInheritors
>   2.    def self.extended(parent)
>   3.      class << parent
>   4.        puts self
>   5.        @@inheritors = []
>   6.
>   7.        def self.inheritors
>   8.          @@inheritors
>   9.        end
>   10.
>   11.        def self.inherited(child)
>   12.          @@inheritors << child
>   13.        end
>   14.      end
>   15.    end
>   16.  end
>   17.
>   18.  class Parent
>   19.    extend TrackInheritors
>   20.  end
>   21.
>   22.  class Child1 < Parent
>   23.  end
>   24.
>   25.  class Child2 < Parent
>   26.  end
>   27.
>   28.  puts Parent.inheritors
>   29.
>   30.  # -:28: undefined method `inheritors' for Parent:Class
>   (NoMethodError)
>

When you open the singleton class of parent, you don't need to define
the methods for "self.", just define them directly, cause you are
already on the singleton class:

module TrackInheritors
def self.extended(parent)
class << parent
puts self
@@inheritors = []

def inheritors
@@inheritors
end

def inherited(child)
@@inheritors << child
end
end
end
end

class Parent
extend TrackInheritors
end

class Child1 < Parent
end

class Child2 < Parent
end

puts Parent.inheritors


$ ruby inheritors.rb
#<Class:Parent>
Child1
Child2

I'm not really sure where were you defining those methods, in the
singleton class of the singleton class?

Jesus.