String和:: String之间有什么区别?

Pis*_*sto 2 ruby

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

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

该课程定义如下.

class String

结束

xin*_*nit 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
Run Code Online (Sandbox Code Playgroud)

由于String存在于顶级命名空间和模块中MyModule,因此需要使用顶级命名空间显式引用顶级字符串::.


Dig*_*oss 5

Stringvs 的特定情况下::String,答案是:大概永远不会有差异.

在常数Xvs 的一般情况下::X,肯定.X可能是A::B::C::X或者A::B::X只是X,但::X总是"只是X",而普通的" X"可能是其中任何一个.

String但是,这是非常重要的,所以没有人会意外地重新定义它.在不太可能的情况下,String定义了一个内部类或模块名称,很可能包含代码的意图使用它而不是String错误,抱歉::String.

更新:我应该补充说,只是看到我认为你的意思class String; end并没有定义类String.在Ruby中,可以重新打开类.该class关键字可能会或可能不会引入一个新的类.它可能只是在现有的行为中添加行为,如果内部没有任何内容,那么它只是一个无操作.老班的行为仍然存在,