访问ruby中的文件 - 差异

时间:2014-02-26 08:39:18

标签: ruby chef

以下陈述之间有何不同?

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

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

我在Ruby的Chef框架中使用了上述语句。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

可以尝试复制您的问题:

不工作:

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

p Foo.file_size # uninitialized constant Foo::File (NameError)

原因是File类可用于顶层(即在类Object的范围内)以及任何类 direct / Object的间接子类。但是FooObject没有任何关系,如果您没有告诉Foo,那么您将无法在File类中访问它(或class Foo< BasicObject def self.file_size ::File.size(__FILE__) end end p Foo.file_size # => 132 常数)实际上可以访问。

工作:

Foo

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

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

答案 2 :(得分:-1)

在旁注上,File.exists?不推荐使用 - 使用File.exist?

据maty说,问题应该以这种方式提出:

“对象,你有存在吗?” “object.exist?”

记住这一点 - 是的,“如果存在文件”不是正确的英文, 但是从红宝石对象那里问这种方式是错误的 观点。

至于前导:: - 这指的是范围。

通常不需要,通常只有在您使用相同名称时才需要 一个班级或一个模块。