tutorial - ¿Qué significa__FILE__ en Ruby?
ruby wikipedia (4)
El valor de __FILE__
es una ruta relativa que se crea y almacena (pero nunca se actualiza) cuando se carga su archivo. Esto significa que si tiene alguna llamada a Dir.chdir
cualquier otro lugar de su aplicación, esta ruta se expandirá incorrectamente.
puts __FILE__
Dir.chdir ''../../''
puts __FILE__
Una solución a este problema es almacenar el valor expandido de __FILE__
fuera de cualquier código de aplicación. Siempre que sus declaraciones de require
estén en la parte superior de sus definiciones (o al menos antes de cualquier llamada a Dir.chdir
), este valor seguirá siendo útil después de cambiar los directorios.
$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__))
# open class and do some stuff that changes directory
puts $MY_FILE_PATH
Veo esto todo el tiempo en Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
¿Qué significa __FILE__
?
En Ruby, la versión de Windows de todos modos, acabo de __FILE__
y __FILE__
no contiene la ruta completa al archivo. En su lugar, contiene la ruta al archivo en relación con el lugar desde donde se ejecuta.
En PHP __FILE__
es la ruta completa (que en mi opinión es preferible). Esta es la razón por la cual, para hacer que tus rutas sean portátiles en Ruby, realmente necesitas usar esto:
File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
Debo tener en cuenta que en Ruby 1.9.1 __FILE__
contiene la ruta completa al archivo, la descripción anterior fue para cuando usé Ruby 1.8.7.
Para ser compatible con Ruby 1.8.7 y 1.9.1 (no estoy seguro de la versión 1.9) deberías requerir archivos utilizando el constructo que mostré anteriormente.
Es una referencia al nombre del archivo actual. En el archivo foo.rb
, __FILE__
se interpretaría como "foo.rb"
.
Edición: Ruby 1.9.2 y 1.9.3 parecen comportarse de manera un poco diferente a lo que dijo Luke Bayes en su comentario . Con estos archivos:
# test.rb
puts __FILE__
require ''./dir2/test.rb''
# dir2/test.rb
puts __FILE__
Ejecutando ruby test.rb
saldrá
test.rb
/full/path/to/dir2/test.rb
__FILE__
es el nombre de archivo con la extensión del archivo que contiene el código que se está ejecutando.
En foo.rb
, __FILE__
sería "foo.rb".
Si foo.rb
estuviera en el directorio /home/josh
entonces File.dirname(__FILE__)
devolvería /home/josh
.