Prev: soap with ruby 1.9 ?
Next: ruby calc.rb or just calc.rb
From: Andrew Wagner on 26 Jul 2010 00:48 [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 26 Jul 2010 02:26 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 26 Jul 2010 02:33 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.
|
Pages: 1 Prev: soap with ruby 1.9 ? Next: ruby calc.rb or just calc.rb |