Ruby 什么';String和::String之间的区别是什么?

Ruby 什么';String和::String之间的区别是什么?,ruby,Ruby,我知道::允许我们访问模块中的项目,或类中的类级项目,但仅::String意味着什么 String==“hi.class和::String==“hi.class”之间有什么区别 该类的定义如下 类字符串 end这意味着“从顶级名称空间访问字符串常量” 类字符串可能在某些模块中定义-这将告诉解释器访问顶级名称空间中的类。在Stringvs::String的特定情况下,答案是:几乎不会有差异 在常量Xvs:X的一般情况下,请确定X可能是A::B::C::X或A::B::X或justX,但是::X始终

我知道
::
允许我们访问模块中的项目,或类中的类级项目,但仅
::String
意味着什么

String==“hi.class
::String==“hi.class
”之间有什么区别

该类的定义如下

类字符串

end

这意味着“从顶级名称空间访问字符串常量”


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

String
vs
::String
的特定情况下,答案是:几乎不会有差异

在常量
X
vs
:X
的一般情况下,请确定
X
可能是
A::B::C::X
A::B::X
或just
X
,但是
::X
始终是“just
X
”,而普通的“
X
”可以是其中任何一个

String
非常重要,因此没有人会意外地重新定义它。在不太可能的情况下,定义了名为
String
的内部类或模块,很可能是包含代码的意图使用它,而不是
String
,err,sorry,
::String


更新:我应该简单地添加查看
类字符串;end
并没有定义类
字符串
,我认为这是你的意思。在Ruby中,类可以重新打开。
class
关键字可能引入也可能不引入新类。它可能只是将行为添加到现有的行为中,如果其中没有任何内容,那么它只是一个禁止操作。旧的类行为仍然存在,

::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
由于顶级命名空间和模块
MyModule
中都存在
String
,因此需要使用顶级命名空间
显式引用顶级字符串