以下陈述之间有何不同?
#(not working)
File.exists?("path to file")
#(working)
::File.exists?("path to file")
我在Ruby的Chef框架中使用了上述语句。
答案 0 :(得分:6)
您使用File
的范围中还有另一个名为File.exists?("path to file")
的常量。但是当您使用::
运算符时,您告诉ruby在File
(Object
)中找到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
的间接子类。但是Foo
与Object
没有任何关系,如果您没有告诉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?”
记住这一点 - 是的,“如果存在文件”不是正确的英文, 但是从红宝石对象那里问这种方式是错误的 观点。
至于前导:: - 这指的是范围。
通常不需要,通常只有在您使用相同名称时才需要 一个班级或一个模块。