我知道::
允许我们访问模块中的项目或类中的类级项目,但只有::String
是什么意思?String和:: String有什么区别?
String =="hi".class
和::String=="hi".class
有什么区别?
该类定义如下。
类字符串
端
我知道::
允许我们访问模块中的项目或类中的类级项目,但只有::String
是什么意思?String和:: String有什么区别?
String =="hi".class
和::String=="hi".class
有什么区别?
该类定义如下。
类字符串
端
::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
中,您需要使用顶级命名空间::
显式引用顶层串。
这意味着 “访问字符串从顶层名字空间常数”。
类字符串可能在某个模块中定义 - 这将告诉解释器访问顶级命名空间中的类。
在String
与::String
的具体情况下,答案是:大概有从来没有是有区别的。
在常量X
vs ::X
的一般情况下,当然。 X
可能是A::B::C::X
或A::B::X
或只是X
,但::X
总是“只是X
”,而普通的“X
”可能是其中的任何一个。
String
虽然是非常重要的,所以没有人会无意中重新定义它。在不太可能的情况下,定义名为String
的内部类或模块时,最有可能包含的代码使用它的意图而非String
,错误,对不起,::String
。
更新:我要补充一点简单地看到class String; end
没有在这个意义上,我想你的意思定义String
类。在Ruby中,类可以重新打开。 class
关键字可能会或可能不会引入新的类。它可能只是为现有的行为添加行为,如果里面什么都没有,那么这只是一个没有操作的行为。老类的行为仍然存在,