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__
?
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__
?
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
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 –
Les doubles traits de soulignement ont été automatiquement supprimés dans le commentaire ci-dessus. –
est-ce encore vrai dans ruby 1.9.2? – Zasz
__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
.
Exactement à la recherche de ceci. +1: =) @Ethan –
Un lien vers la documentation [ici] (http://ruby-doc.org/docs/keywords/1.9/Object.html#method-i-__FILE__) –
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.
Vous devez ajouter une barre oblique à votre chemin relatif: File.expand_path (File.dirname (__ FILE__) + "/ relative/path/to/file") ' –
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 "))' –
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
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 –