Ruby constant lookup for classes in modules

What’s the difference between defining a class inside of a module and
using the module as a prefix?

module Foo
class Bar
end
end

module Foo
class Works
def f
Bar.new
end
end
end

class Foo::Fails
def f
Bar.new
end
end

Foo::Works.new.f
Foo::Fails.new.f

The last line fails:

lookup.rb:16:in `f’: uninitialized constant Foo::Fails::Bar (NameError)
from lookup.rb:21

I would have thought that both ways of placing a class in a module would
be equivalent.

Thanks.

Jack

On Sep 1, 1:09 am, Jack C. [email protected] wrote:

 def f

Thanks.

Jack

Hi Jack,

I believe the difference is one of scope:

module Foo
class Works

means “put Works in the namespace of Foo” and “define Works in the
scope of the module Foo”, and hence ‘Bar’ is accessible.

class Foo::Fails

means, “put Fails in the namespace of Foo” but “define Fails in the
current scope”, and hence ‘Bar’ is not accessible.

Hope that helps,

Peter.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs