ruby :: Module或只是模块

时间:2011-05-15 21:20:25

标签: ruby-on-rails ruby

我正在慢慢穿过导轨源,以便更好地抓住红宝石和导轨。在以下rails类test_case.rb

该行是

 class TestCase < ::Test::Unit::TestCase

我想知道做以下事情是否有任何区别

 class TestCase < Test::Unit::TestCase

这可能看似微不足道,但这些事情对于选择一种新语言至关重要。如果我删除了前导符,那么测试仍会针对ActiveSupport运行,那么它是做什么的......:P

2 个答案:

答案 0 :(得分:8)

::Test确保您获得名为Test的顶级模块。

后一种情况(Test::Unit::TestCase)不能确保Test是一个顶层模块,例如它可以是一个类。这意味着大部分时间它都会起作用,但你可能会意外地破坏它。

答案 1 :(得分:5)

想象一下,你有这个代码

module UserTesting
   class Test # Details about a simple test
   end


   class TestCases < Test::Unit::TestCase
   end
end
# => NameError: uninitialized constant UserTesting::Test::Unit

这会导致错误,因为您正在创建的类可用的Test常量中没有Unit常量。如果你通过::解决它,这就像路径中的前导斜杠。

还有一个使用它们的特殊情况 - 你可以用默认的根命名空间之外的其他东西来评估你的代码,并且你实际上需要双冒号来解决像:: Object这样的类(通常是对它们进行monkeypatch)。