215 votes

Que signifie __FILE__ dans Ruby?

Je vois ça tout le temps en Ruby:

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

Que signifie __FILE__ ?

144voto

Geoff Points 2563

C'est une référence à l'actuel nom de fichier. Dans le fichier foo.rb, __FILE__ serait interprété comme "foo.rb".

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

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

L'exécution ruby test.rb seront de sortie

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

62voto

Luke Bayes Points 2319

La valeur de __FILE__ est un chemin d'accès relatif est créé et stocké (mais jamais mis à jour) une fois que votre fichier est chargé. Cela signifie que si vous avez des appels d' Dir.chdir n'importe où ailleurs dans votre application, ce chemin vous développez de manière incorrecte.

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

Une solution de contournement pour ce problème consiste à stocker l'élargissement de la valeur de FICHIERS en dehors de tout code de l'application. Tant que votre require des déclarations sont en haut de votre définitions (ou, au moins, avant tout appel à Dir.chdir), cette valeur va continuer à être utile après un changement de répertoires.

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

# open class and do some stuff that changes directory

puts $MY_FILE_PATH

28voto

Ethan Points 13856

__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 foo.rb trouvait dans le répertoire /home/josh alors File.dirname(__FILE__) retournerait /home/josh .

17voto

Matt Wolfe Points 4123

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

En PHP __FILE__ est le chemin d'accès complet (qui à mon avis est préférable). C'est pourquoi, afin de rendre votre chemins de portable en Ruby, vous avez vraiment besoin d'utiliser cette:

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

Il est à noter que dans Ruby 1.9.1 __FILE__ contient le chemin complet du fichier, la description ci-dessus a été lorsque j'ai utilisé Ruby 1.8.7.

Afin d'être compatible à la fois avec Ruby 1.8.7 et 1.9.1 (pas sûr d'environ 1,9), vous devez exiger des fichiers à l'aide de la construction, j'ai montré ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X