Forum: Ruby method defined in module doesn't have access to Constant in

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Mike S. (Guest)
on 2007-04-09 21:38
(Received via mailing list)
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"
Rick D. (Guest)
on 2007-04-09 22:25
(Received via mailing list)
On 4/9/07, Mike S. <removed_email_address@domain.invalid> 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/
Joel VanderWerf (Guest)
on 2007-04-10 02:33
(Received via mailing list)
Mike S. 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
This topic is locked and can not be replied to.