Eu vejo isso o tempo todo em Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
O que __FILE__
significa isso ?
Eu vejo isso o tempo todo em Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
O que __FILE__
significa isso ?
Respostas:
É 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.rb
produzirá
test.rb
/full/path/to/dir2/test.rb
`__FILE__`
para receber __FILE__
.
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.chdir
qualquer 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 require
instruçõ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
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.
__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.rb
estivesse no dir /home/josh
, File.dirname(__FILE__)
retornaria /home/josh
.
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.
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )