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

时间:2011-02-16 06:23:36

标签: ruby

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

String =="hi".class::String=="hi".class ??

之间有什么区别?

该课程定义如下。

class String

3 个答案:

答案 0 :(得分: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中,因此您需要使用顶级命名空间::显式引用顶级字符串。

答案 1 :(得分:5)

String vs ::String的特定情况下,答案是:永远不会与众不同。

在常数X::X的一般情况下,当然。 X可能是A::B::C::XA::B::X,也可能只是X,但::X始终是“仅X”,而普通“X “可能是其中任何一个。

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

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

答案 2 :(得分:2)

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

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