Siva Gnanam
Siva Gnanam

Reputation: 1012

Accessing a file in ruby - differences

What is the different between the following statements?

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

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

I used above statements in Chef framework of Ruby.

Upvotes: 5

Views: 239

Answers (3)

shevy
shevy

Reputation: 1000

On a side-note, File.exists? is deprecated - use File.exist?

According to maty, the question should be asked in this way:

"object, do you exist?" "object.exist?"

Keep this in mind - yes, "if file exist" is not proper english, but asking it that way would be wrong from the ruby object point of view.

As for the leading :: - this refers to toplevel scope.

It is not often required, usually only when you have the same name of a class or a module.

Upvotes: -1

Arup Rakshit
Arup Rakshit

Reputation: 118271

Here is possible try to replicate your issue :

Not working :

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

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

The reason is File class is available to the top level ( i.e. in the scope of the class Object) and inside any class which is a direct/ indirect subclass of Object. But Foo has no relation with Object, you wouldn't be able to access it inside Foo, if you don't tell it, from where File class ( or constant ) actually accessible.

Working :

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

p Foo.file_size # => 132

Although here also, Foo has no relation with Object, but we are explicitly ( by using :: constant scope resolution operator ) telling Ruby that from where we are trying to access the File class ( Remember class(s) are also constant in Ruby) inside Foo class. Thus here is no objection from Ruby.

Check out if such situation is present in your code too.

Upvotes: 6

avl
avl

Reputation: 662

There is another constant named File in the scope where you are using File.exists?("path to file"). But when you use the :: operator, you are telling ruby to find the File constant in Object (Object::File)

Upvotes: 7

Related Questions