Que signifie __FILE__ en Ruby?

Réponses:

144

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".

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

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

La course ruby test.rbproduira

test.rb
/full/path/to/dir2/test.rb
Geoff
la source
87
Cette réponse n'est pas exacte. FILE est le chemin "relatif" du fichier à partir du répertoire d'exécution actuel - non absolu. Vous devez utiliser File.expand_path ( FILE ) pour obtenir le chemin absolu
Luke Bayes
7
Les doubles soulignements ont été automatiquement supprimés dans le commentaire ci-dessus.
Luke Bayes
1
est-ce toujours vrai dans ruby ​​1.9.2?
Zasz
4
@Zasz Cela fonctionne un peu différemment en 1.9.2. Le fichier initialement chargé a un __FILE__ relatif, mais les autres fichiers inclus / requis ont des chemins absolus.
Geoff
9
@LukeBayes Vous pouvez conserver les traits de soulignement et autres caractères spéciaux dans les commentaires Stack Overflow en entourant le texte littéral avec des astuces. Écrivez `__FILE__`pour obtenir __FILE__.
Rory O'Kane
62

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 vers Dir.chdirun autre endroit de votre application, ce chemin d'accès ne se développera pas correctement.

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

Une solution de contournement à ce problème consiste à stocker la valeur étendue de l' __FILE__extérieur de tout code d'application. Tant que vos requireinstructions sont en haut de vos définitions (ou au moins avant tout appel à Dir.chdir), cette valeur continuera d'ê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
Luke Bayes
la source
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.Le chemin s'est correctement développé sous mon test. Ma version rubis est 2.3.7, peut-être que la nouvelle version rubis a résolu ce problème.
Alec.Zhou
28

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

Dans foo.rb, __FILE__serait "foo.rb".

Si se foo.rbtrouvaient dans le répertoire /home/joshpuis File.dirname(__FILE__)reviendrait /home/josh.

Ethan
la source
Je cherche exactement ça. +1: =) @Ethan
KM Rakibul Islam
1
Un lien vers la documentation ici
Ross Attrill
17

Dans Ruby, la version Windows de toute façon, je viens de vérifier et __FILE__ne contient pas le chemin d'accès complet au fichier. Au lieu de cela, il contient le chemin d'accès au fichier par rapport à son emplacement d'exécution.

En PHP, __FILE__c'est le chemin complet (qui à mon avis est préférable). C'est pourquoi, pour rendre vos chemins portables dans Ruby, vous devez vraiment utiliser ceci:

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

Je dois noter que dans Ruby 1.9.1 __FILE__contient le chemin d'accès complet au fichier, la description ci-dessus était pour quand j'ai utilisé Ruby 1.8.7.

Afin d'être compatible avec Ruby 1.8.7 et 1.9.1 (pas sûr de 1.9), vous devez avoir besoin de fichiers en utilisant la construction que j'ai montrée ci-dessus.

Matt Wolfe
la source
Vous devez ajouter une barre oblique à votre chemin relatif:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe
3
Vous ne devez jamais coder en dur le séparateur de répertoire. Utilisez plutôt File.join: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Andrew Hodgkinson