我知道::允许我们访问模块中的项目,或者类中的类级别项目,但这仅仅::String意味着什么?
String =="hi".class和::String=="hi".class?? 之间有什么区别?
该课程定义如下.
class String
结束
::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,因此需要使用顶级命名空间显式引用顶级字符串::.
在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关键字可能会或可能不会引入一个新的类.它可能只是在现有的行为中添加行为,如果内部没有任何内容,那么它只是一个无操作.老班的行为仍然存在,
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |