嵌套模块定义和在ruby中使用:: in definition之间有什么区别?

时间:2012-07-09 10:23:47

标签: ruby scope constants

这有什么区别:

module Outer
  module Inner
    class Foo
    end
  end
end

和此:

module Outer::Inner
  class Foo
  end
end

我知道如果先前没有定义Outer,后一个例子将不起作用,但是在常量范围内存在一些其他差异,我可以在SO或文档中找到它们的描述(包括编程Ruby书)< / p>

2 个答案:

答案 0 :(得分:7)

感谢keymone的answer我制定了正确的Google查询并发现了这一点:Module.nesting and constant name resolution in Ruby

使用::更改常量范围解析

module A
  module B
    module C1
      # This shows modules where ruby will look for constants, in this order
      Module.nesting # => [A::B::C1, A::B, A]
    end
  end
end

module A
  module B::C2
    # Skipping A::B because of ::
    Module.nesting # => [A::B::C2, A]
  end
end

答案 1 :(得分:3)

至少存在一个差异 - 常量查找,请检查此代码:

module A
  CONST = 1

  module B
    CONST = 2

    module C
      def self.const
        CONST
      end
    end
  end
end

module X
  module Y
    CONST = 2
  end
end

module X
  CONST = 1

  module Y::Z
    def self.const
      CONST
    end
  end
end

puts A::B::C.const # => 2, CONST value is resolved to A::B::CONST
puts X::Y::Z.const # => 1, CONST value is resolved to X::CONST