我知道::
允许我们访问模块中的项目或类中的类级别项目,但只有::String
意味着什么?
String =="hi".class
和::String=="hi".class
??
该课程定义如下。
class String
端
答案 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::X
或A::B::X
,也可能只是X
,但::X
始终是“仅X
”,而普通“X
“可能是其中任何一个。
String
非常重要,所以没有人会意外地重新定义它。在不太可能的情况下,定义了名为String
的内部类或模块,很可能包含代码的意图使用它而不是String
,错误,抱歉,::String
。
更新:我应该补充一点,因为我认为你的意思是class String; end
没有定义类String
。在Ruby中,可以重新打开类。 class
关键字可能引入也可能不会引入新类。它可能只是在现有的行为中添加行为,如果内部没有任何内容,那么它只是一个无操作。旧班的行为仍然存在,
答案 2 :(得分:2)
这意味着“从顶级命名空间访问字符串常量”。
类字符串可能在某个模块中定义 - 这将告诉解释器访问顶级命名空间中的类。