Ruby 中 File 和 ::File 有什么区别?

3

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

有人能够解释一下这两者之间的区别,并且使用这两种方法的不同原因吗?

2个回答

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

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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接