Does anyone know why a method defined in a module that is then included in a class does not have access to the constants of that class? Doesn't including the module make all its methods into instance methods of the class? Shouldn't get_foo and class_get_foo in the following example work the same? module ModFoo def get_foo FOO end end class Foo FOO = 'this is foo' include ModFoo def class_get_foo FOO end end f = Foo.new f.get_foo >> f.get_foo NameError: uninitialized constant ModFoo::FOO from (irb):3:in `get_foo' from (irb):11 from :0 f.class_get_foo => "this is foo"
on 2007-04-09 19:38
on 2007-04-09 20:25
On 4/9/07, Mike Sandler <firstname.lastname@example.org> wrote: > end > > f.class_get_foo > => "this is foo" > Because Mod::FOO, and Foo::FOO are two different constants in two different namespaces. Included methods aren't source macros, they get compiled in the context of the module that contains them, so when ModuleFoo#getFoo was compiled, FOO got bound to ModuleFoo::FOO, hence the error. -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/
on 2007-04-10 00:33
Mike Sandler wrote: > Does anyone know why a method defined in a module that is then included > in a > class does not have > access to the constants of that class? Doesn't including the module make > all its methods into instance methods > of the class? Shouldn't get_foo and class_get_foo in the following example > work the same? You can make it work as follows: > module ModFoo > def get_foo > FOO self.class::FOO