2011-02-16 88 views
2

我知道::允许我们访问模块中的项目或类中的类级项目,但只有::String是什么意思?String和:: String有什么区别?

String =="hi".class::String=="hi".class有什么区别?

该类定义如下。

类字符串

回答

6

::String引用顶级String类。 String引用当前名称空间中的字符串或上面的名称空间。

看看下面的代码:

module MyModule 
    class String 
    def initialize(s); end 

    def split(operator=nil) 
     puts "This string doesn't split" 
    end 
    end 

    class SomeClass 
    def bar 
     s = String.new("foo:bar") 
     s.split(":") 
    end 

    def foo 
     s = ::String.new("foo:bar") 
     s.split(":") 
    end 
    end 

end 

sc = MyModule::SomeClass.new 

sc.foo 
=> ["foo", "bar"] 

sc.bar 
This string doesn't split 
=> nil 

由于String中都存在的顶级命名空间和模块MyModule中,您需要使用顶级命名空间::显式引用顶层串。

2

这意味着 “访问字符串从顶层名字空间常数”。

类字符串可能在某个模块中定义 - 这将告诉解释器访问顶级命名空间中的类。

5

String::String的具体情况下,答案是:大概有从来没有是有区别的。

在常量X vs ::X的一般情况下,当然。 X可能是A::B::C::XA::B::X或只是X,但::X总是“只是X”,而普通的“X”可能是其中的任何一个。

String虽然是非常重要的,所以没有人会无意中重新定义它。在不太可能的情况下,定义名为String的内部类或模块时,最有可能包含的代码使用它的意图而非String,错误,对不起,::String

更新:我要补充一点简单地看到class String; end没有在这个意义上,我想你的意思定义String类。在Ruby中,类可以重新打开。 class关键字可能会或可能不会引入新的类。它可能只是为现有的行为添加行为,如果里面什么都没有,那么这只是一个没有操作的行为。老类的行为仍然存在,

相关问题