Module MyMod::MyOtherMod question

Can someone please explain what the difference is?

A assumed these were synonymous, but they are not:

module A
   module B
      ...
   end
end

Not equivalent to?:

module A::B
   ...
end

Thanks alot.

···

--
Posted via http://www.ruby-forum.com/.

Gene Angelo wrote:

[I] assumed these were synonymous, but they are not:

I stand corrected. It appears that in order to use the following syntax:

module A::B
   ...
end

module A must be defined.

···

--
Posted via http://www.ruby-forum.com/\.

Gene Angelo wrote:

Gene Angelo wrote:

[I] assumed these were synonymous, but they are not:

I stand corrected. It appears that in order to use the following syntax:

module A::B
   ...
end

module A must be defined.

Yes. But even then,

module A; end
module A::B
  ...
end

is different to

module A
  module B
    ...
  end
end

in the way that constants are looked up.

module A; FOO = 123; end

=> 123

module A::B
puts FOO
end

NameError: uninitialized constant A::b::FOO
  from (irb):3

module A; module B
puts FOO
end; end

123
=> nil

···

from :0
--
Posted via http://www.ruby-forum.com/\.

The constant that classes are assigned to when defined may be prefixed
by the names of existing modules using the scope operator (::). When
this happens, the leading scope operator places the class or module in
the top-level scope.

Here is the example:

CONST = 'outer'

module A
  CONST = 'inner'
end

module A
  class B
    def self.get_const
      CONST
    end
  end
end

p A::B.get_const # => inner

Now, class B is inserted into module A's namespace, but it's not
interpreted in the context of A. As a result, the reference to CONST
resolves to the top-level constant, not A's version.

class A::B
  def self.get_const
    CONST
  end
end

p A::B.get_const # => outer

···

On Sep 30, 2:12 pm, Brian Candler <b.cand...@pobox.com> wrote:

Gene Angelo wrote:
> Gene Angelo wrote:
>> [I] assumed these were synonymous, but they are not:

> I stand corrected. It appears that in order to use the following syntax:

> module A::B
> ...
> end

> module A must be defined.

Yes. But even then,

module A; end
module A::B
...
end

is different to

module A
module B
...
end
end

in the way that constants are looked up.

>> module A; FOO = 123; end
=> 123
>> module A::B
>> puts FOO
>> end

NameError: uninitialized constant A::b::FOO
from (irb):3
from :0>> module A; module B
>> puts FOO
>> end; end

123
=> nil
--
Posted viahttp://www.ruby-forum.com/.