Je vois ça tout le temps en Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Que signifie __FILE__
?
Je vois ça tout le temps en Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Que signifie __FILE__
?
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
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
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 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.