2008-10-22 21 views
201

Veo esto todo el tiempo en Ruby:¿Qué significa __FILE__ en Ruby?

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

¿Qué significa __FILE__?

+0

Para ayudar a atar juntos referencias, véase también https://www.ruby-forum.com/topic/143383 y http://stackoverflow.com/questions/4325759/is-require-file-expand- ruta-archivo-la-mejor-práctica? lq = 1 –

Respuesta

133

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 de una manera un poco diferente de lo que dijo Luke Bayes en his comment. Con estos archivos:

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

Ejecución de salida ruby test.rb voluntad

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

Esta respuesta no es precisa. __FILE__ es la ruta "relativa" al archivo desde el directorio de ejecución actual, no absoluto. Debes usar File.expand_path (__ FILE__) para obtener la ruta absoluta –

+6

Los guiones bajos dobles se eliminaron automáticamente en el comentario anterior. –

+1

esto sigue siendo cierto en ruby ​​1.9.2? – Zasz

24

__FILE__ es el nombre del archivo con la extensión del archivo que contiene el código que está siendo ejecutado.

En foo.rb, __FILE__ sería "foo.rb".

Si foo.rb estaban en el directorio /home/josh entonces File.dirname(__FILE__) devolvería /home/josh.

+0

Exactamente buscando esto. +1: =) @Ethan –

+1

Un enlace a la documentación [aquí] (http://ruby-doc.org/docs/keywords/1.9/Object.html#method-i-__FILE__) –

17

En Ruby, la versión de Windows de todos modos, acabo de verificar y __FILE__ no contiene la ruta completa al archivo. En su lugar, contiene la ruta al archivo relativo a donde se está ejecutando.

En PHP __FILE__ es la ruta completa (que en mi opinión es preferible). Es por esto que, con el fin de hacer que sus caminos portátil en Ruby, que realmente necesita para utilizar este:

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 usé Ruby 1.8.7.

Para ser compatible tanto con Ruby 1.8.7 como con 1.9.1 (no estoy seguro acerca de 1.9) debe requerir archivos usando la construcción que mostré arriba.

+0

Necesita anteponer una barra oblicua a su ruta relativa: 'File.expand_path (File.dirname (__ FILE__) +"/relative/path/to/file ")' –

+2

Nunca debe codificar el separador de directorios. Use File.join en su lugar: 'File.expand_path (File.join (File.dirname (__ FILE__)," relative "," path "," to "," file "))' –

59

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 llamadas al Dir.chdir en 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 la de almacenar el valor expandido de __FILE__ fuera de cualquier código de la aplicación. Siempre que sus declaraciones require estén en la parte superior de sus definiciones (o al menos antes de cualquier llamada al 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