¿Qué significa __FILE__ en Ruby?

Respuestas:

144

Es una referencia al nombre del archivo actual. En el archivo foo.rb, __FILE__se interpretaría como "foo.rb".

Editar: Ruby 1.9.2 y 1.9.3 parecen comportarse un poco diferente de lo que dijo Luke Bayes en su comentario . Con estos archivos:

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

La ejecución ruby test.rbdará salida

test.rb
/full/path/to/dir2/test.rb
Geoff
fuente
87
Esta respuesta no es precisa. ARCHIVO es la ruta "relativa" al archivo desde el directorio de ejecución actual, no absoluto. Debe usar File.expand_path ( FILE ) para obtener la ruta absoluta
Luke Bayes
77
Los guiones bajos dobles se eliminaron automáticamente dentro del comentario anterior.
Luke Bayes
1
¿sigue siendo cierto en ruby ​​1.9.2?
Zasz
44
@Zasz Funciona un poco diferente en 1.9.2. El archivo cargado inicialmente tiene un __FILE__ relativo, pero otros archivos incluidos / requeridos tienen rutas absolutas.
Geoff
99
@LukeBayes Puede preservar los guiones bajos y otros caracteres especiales en los comentarios de Desbordamiento de pila rodeando el texto literal con comillas invertidas. Escribe `__FILE__`para obtener __FILE__.
Rory O'Kane
62

El valor de __FILE__es una ruta relativa que se crea y almacena (pero nunca se actualiza) cuando se carga el archivo. Esto significa que si tiene alguna llamada a Dir.chdircualquier 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 __FILE__fuera de cualquier código de aplicación. Mientras sus requiredeclaraciones estén en la parte superior de sus definiciones (o al menos antes de cualquier llamada a Dir.chdir), este valor continuará 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
Luke Bayes
fuente
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.El camino se expandió correctamente bajo mi prueba. Mi versión ruby ​​es 2.3.7, tal vez la versión ruby ​​más nueva solucionó este problema.
Alec.Zhou
28

__FILE__ es el nombre del 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.rbestaban en el dir /home/joshentonces File.dirname(__FILE__)volvería /home/josh.

Ethan
fuente
Exactamente buscando esto. +1: =) @Ethan
KM Rakibul Islam
1
Un enlace a la documentación aquí
Ross Attrill
17

En Ruby, la versión de Windows de todos modos, acabo de comprobar 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 sus caminos sean portátiles en Ruby, realmente necesita usar esto:

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

Debo señalar que en Ruby 1.9.1 __FILE__contiene la ruta completa al archivo, la descripción anterior fue para cuando utilicé Ruby 1.8.7.

Para ser compatible con Ruby 1.8.7 y 1.9.1 (no estoy seguro acerca de 1.9), debe requerir archivos utilizando la construcción que mostré anteriormente.

Matt Wolfe
fuente
Debe anteponer un corte a su camino relativo:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe
3
Nunca debe codificar el separador de directorio. Utilice File.join en su lugar: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Andrew Hodgkinson