O que significa __FILE__ em Ruby?

Respostas:

144

É uma referência ao nome do arquivo atual. No arquivo foo.rb, __FILE__seria interpretado como "foo.rb".

Edit: Ruby 1.9.2 e 1.9.3 parecem se comportar um pouco diferente do que Luke Bayes disse em seu comentário . Com esses arquivos:

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

A execução ruby test.rbproduzirá

test.rb
/full/path/to/dir2/test.rb
Geoff
fonte
87
Esta resposta não é precisa. FILE é o caminho "relativo" para o arquivo do diretório de execução atual - não absoluto. Você deve usar File.expand_path ( ARQUIVO ) para obter o caminho absoluto
Luke Bayes
7
Os sublinhados duplos foram removidos automaticamente no comentário acima.
Luke Bayes
1
isso ainda é verdade no ruby ​​1.9.2?
Zasz
4
@Zasz Funciona meio diferente no 1.9.2. O arquivo carregado inicialmente possui um __FILE__ relativo, mas outros arquivos incluídos / necessários têm caminhos absolutos.
Geoff
9
@LukeBayes Você pode preservar sublinhados e outros caracteres especiais nos comentários do Stack Overflow cercando o texto literal com reticulares. Escreva `__FILE__`para receber __FILE__.
Rory O'Kane
62

O valor de __FILE__é um caminho relativo que é criado e armazenado (mas nunca atualizado) quando o arquivo é carregado. Isso significa que, se você tiver chamadas para Dir.chdirqualquer outro lugar no seu aplicativo, esse caminho será expandido incorretamente.

puts __FILE__
Dir.chdir '../../'
puts __FILE__

Uma solução alternativa para esse problema é armazenar o valor expandido de __FILE__fora de qualquer código de aplicativo. Desde que suas requireinstruções estejam no topo de suas definições (ou pelo menos antes de qualquer chamada para Dir.chdir), esse valor continuará sendo útil após a alteração de diretórios.

$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__))

# open class and do some stuff that changes directory

puts $MY_FILE_PATH
Luke Bayes
fonte
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.O caminho foi expandido corretamente no meu teste. Minha versão do ruby ​​é 2.3.7, talvez a versão mais recente do ruby ​​tenha corrigido esse problema.
Alec.Zhou
28

__FILE__ é o nome do arquivo com extensão do arquivo que contém o código que está sendo executado.

In foo.rb,__FILE__ seria "foo.rb".

Se foo.rbestivesse no dir /home/josh, File.dirname(__FILE__)retornaria /home/josh.

Ethan
fonte
Exatamente procurando por isso. +1: =) @Ethan
KM Rakibul Islam
1
Um link para a documentação aqui
Ross Attrill
17

De qualquer forma, no Ruby, a versão do Windows, acabei de verificar e __FILE__não contém o caminho completo para o arquivo. Em vez disso, contém o caminho para o arquivo em relação ao local de execução.

Em PHP __FILE__é o caminho completo (que na minha opinião é preferível). É por isso que, para tornar seus caminhos portáteis em Ruby, você realmente precisa usar isso:

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

Devo observar que no Ruby 1.9.1 __FILE__contém o caminho completo para o arquivo, a descrição acima era para quando usei o Ruby 1.8.7.

Para ser compatível com o Ruby 1.8.7 e 1.9.1 (não tenho certeza sobre o 1.9), você deve solicitar arquivos usando a construção mostrada acima.

Matt Wolfe
fonte
Você precisa prefixar uma barra para o seu caminho relativo:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe
3
Você nunca deve codificar o separador de diretório. Use File.join: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Andrew Hodgkinson