2008-10-22 6 views
201

Je vois tout le temps en Ruby:Que signifie __FILE__ dans Ruby?

require File.dirname(__FILE__) + "/../../config/environment" 

Qu'est-ce que cela signifie __FILE__?

+0

Pour aider à relier ensemble des références, voir aussi https://www.ruby-forum.com/topic/143383 et http://stackoverflow.com/questions/4325759/is-require-file-expand- path-file-the-best-practice? lq = 1 –

Répondre

133

Il s'agit d'une référence au nom de fichier actuel. Dans le fichier foo.rb, __FILE__ serait interprété comme "foo.rb".

Modifier: Ruby 1.9.2 et 1.9.3 semblent se comporter un peu différemment de ce que Luke Bayes a dit dans his comment. Avec ces fichiers:

# test.rb 
puts __FILE__ 
require './dir2/test.rb' 
# dir2/test.rb 
puts __FILE__ 

Exécution ruby test.rb volonté sortie

test.rb 
/full/path/to/dir2/test.rb 
+80

Cette réponse n'est pas exacte. __FILE__ est le chemin "relatif" au fichier du répertoire d'exécution actuel - pas absolu. Vous devez utiliser le fichier.expand_path (__ FILE__) pour obtenir le chemin absolu –

+6

Les doubles traits de soulignement ont été automatiquement supprimés dans le commentaire ci-dessus. –

+1

est-ce encore vrai dans ruby ​​1.9.2? – Zasz

24

__FILE__ est le nom du fichier avec l'extension du fichier contenant le code en cours d'exécution.

Dans foo.rb, __FILE__ serait "foo.rb".

Si foo.rb étaient dans le répertoire /home/josh alors File.dirname(__FILE__) renverrait /home/josh.

+0

Exactement à la recherche de ceci. +1: =) @Ethan –

+1

Un lien vers la documentation [ici] (http://ruby-doc.org/docs/keywords/1.9/Object.html#method-i-__FILE__) –

17

Dans Ruby, la version Windows de toute façon, je viens de vérifier et __FILE__ ne contient pas le chemin complet du fichier. Au lieu de cela, il contient le chemin d'accès au fichier par rapport à l'endroit où il est exécuté.

En PHP __FILE__ est le chemin complet (qui à mon avis est préférable). Voilà pourquoi, afin de rendre vos chemins portable en Ruby, vous avez vraiment besoin d'utiliser ceci:

File.expand_path(File.dirname(__FILE__) + "relative/path/to/file") 

Je dois souligner que Ruby 1.9.1 __FILE__ contient le chemin complet du fichier, la description ci-dessus était pour quand j'ai utilisé Ruby 1.8.7.

Pour être compatible avec Ruby 1.8.7 et 1.9.1 (pas sûr 1.9), vous devriez exiger des fichiers en utilisant la construction je l'ai montré ci-dessus.

+0

Vous devez ajouter une barre oblique à votre chemin relatif: File.expand_path (File.dirname (__ FILE__) + "/ relative/path/to/file") ' –

+2

Vous ne devriez jamais coder en dur le séparateur de répertoire. Utilisez File.join à la place: 'File.expand_path (File.join (File.dirname (__ FICHIER__)," relative "," path "," to "," file "))' –

59

La valeur de __FILE__ est un chemin relatif qui est créé et stocké (mais jamais mis à jour) lorsque votre fichier est chargé. Cela signifie que si vous avez des appels à Dir.chdir n'importe où ailleurs dans votre application, ce chemin ne se développera pas correctement.

puts __FILE__ 
Dir.chdir '../../' 
puts __FILE__ 

Une solution à ce problème consiste à stocker la valeur élargie de __FILE__ en dehors de tout code d'application. Tant que vos instructions require sont en haut de vos définitions (ou au moins avant tout appel à Dir.chdir), cette valeur continuera à être utile après avoir changé de répertoire.

$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__)) 

# open class and do some stuff that changes directory 

puts $MY_FILE_PATH