访问ruby中的文件 - 差异

Siv*_*nam 3 ruby chef-infra

以下陈述有何不同?

#(not working)
File.exists?("path to file")

#(working)
::File.exists?("path to file")
Run Code Online (Sandbox Code Playgroud)

我在Ruby的Chef框架中使用了上面的语句.

avl*_*rov 6

File在您使用的范围中有另一个常量命名File.exists?("path to file").但是当你使用::运算符时,你告诉ruby FileObject(Object::File)中找到常量


Aru*_*hit 5

可以尝试复制您的问题:

不工作:

class Foo< BasicObject
  def self.file_size
     File.size(__FILE__)
  end
end

p Foo.file_size # uninitialized constant Foo::File (NameError)
Run Code Online (Sandbox Code Playgroud)

原因是File类可用于顶层(即在类的范围内Object)以及任何类的直接/间接子类Object.但Foo与之Object无关Foo,如果你没有告诉它,你将无法访问它,从哪个File类(或常量)实际可访问.

工作:

class Foo< BasicObject
  def self.file_size
     ::File.size(__FILE__)
  end
end

p Foo.file_size # => 132
Run Code Online (Sandbox Code Playgroud)

虽然这里也Foo没有关系Object,但是我们明确地(通过使用::常量范围解析运算符)告诉Ruby我们从哪里尝试访问File类(请记住类在Ruby中也是常量)Foo.因此Ruby不反对.

检查代码中是否存在这种情况.