Ruby中的File和:: File之间的区别?

时间:2013-01-11 04:46:48

标签: ruby

我遇到过两种调用文件类的方法:File::File

有人可以向我解释两者之间的区别,以及使用这两者的不同原因吗?

2 个答案:

答案 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'