我遇到过两种调用文件类的方法:File
和::File
有人可以向我解释两者之间的区别,以及使用这两者的不同原因吗?
答案 0 :(得分:4)
File
指的是当前范围中的File
常量,而::File
始终指的是Object::File
。
p File
# File
p ::File
# File
module Another
module File
end
p File
# Another::File
p ::File
# File
end
因此,::
类似于文件系统的根,而您所在的模块类似于当前目录。
对于面向对象的当前词法范围访问,请参阅Module.nesting。
答案 1 :(得分:2)
当您引用具有短名称(File
)的类时,ruby将使用距离最近范围的类。看:
module MyModule
class File
def initialize *args; end
end
class Foo
def initialize
@file = File.new
end
attr_accessor :file
end
end
f = MyModule::Foo.new
f.file.class # => MyModule::File
file2 = File.new 'newfile', 'w'
file2.class # => File
因此,Foo
看到与顶级代码不同的File
。但是,如果Foo
要使用此代码:
@file = ::File.new
然后它将使用“全局”File
类,而不是MyModule
的本地类。以类似的方式,我们可以在顶层使用MyModule::File
file2 = MyModule::File.new 'newfile', 'w'