Lo vedo sempre in Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Cosa __FILE__
significa?
Lo vedo sempre in Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Cosa __FILE__
significa?
Risposte:
È un riferimento al nome del file corrente. Nel file foo.rb
, __FILE__
sarebbe interpretato come "foo.rb"
.
Modifica: Ruby 1.9.2 e 1.9.3 sembrano comportarsi in modo leggermente diverso da quello che Luke Bayes ha detto nel suo commento . Con questi file:
# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__
In esecuzione ruby test.rb
verrà emesso
test.rb
/full/path/to/dir2/test.rb
`__FILE__`
per ottenere __FILE__
.
Il valore di __FILE__
è un percorso relativo che viene creato e archiviato (ma mai aggiornato) quando il file viene caricato. Ciò significa che se si hanno chiamate da Dir.chdir
qualsiasi altra parte dell'applicazione, questo percorso si espanderà in modo errato.
puts __FILE__
Dir.chdir '../../'
puts __FILE__
Una soluzione alternativa a questo problema è l'archiviazione del valore espanso __FILE__
all'esterno di qualsiasi codice dell'applicazione. Finché le require
dichiarazioni sono in cima alle definizioni (o almeno prima di qualsiasi chiamata a Dir.chdir
), questo valore continuerà a essere utile dopo aver modificato le directory.
$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.
Il percorso si è espanso correttamente sotto il mio test. La mia versione ruby è 2.3.7, forse la versione ruby più recente ha risolto questo problema.
__FILE__
è il nome file con estensione del file contenente il codice in esecuzione.
In foo.rb
, __FILE__
sarebbe "foo.rb".
Se foo.rb
fossero nella directory, /home/josh
allora File.dirname(__FILE__)
ritornerebbero /home/josh
.
In Ruby, comunque la versione di Windows, ho appena controllato e __FILE__
non contiene il percorso completo del file. Invece contiene il percorso del file relativamente a dove viene eseguito.
In PHP __FILE__
è il percorso completo (che a mio avviso è preferibile). Ecco perché, per rendere portatili i tuoi percorsi in Ruby, devi davvero usare questo:
File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
Devo notare che in Ruby 1.9.1 __FILE__
contiene il percorso completo del file, la descrizione sopra era per quando ho usato Ruby 1.8.7.
Per essere compatibile con Ruby 1.8.7 e 1.9.1 (non sono sicuro circa 1.9) dovresti richiedere i file usando il costrutto che ho mostrato sopra.
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )