Che cosa significa __FILE__ in Ruby?


Risposte:


144

È 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.rbverrà emesso

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

87
Questa risposta non è precisa FILE è il percorso "relativo" del file dalla directory di esecuzione corrente - non assoluto. È necessario utilizzare File.expand_path ( FILE ) per ottenere il percorso assoluto
Luke Bayes,

7
I doppi trattini bassi sono stati rimossi automaticamente nel commento sopra.
Luke Bayes,

1
è ancora vero in ruby ​​1.9.2?
Zasz,

4
@Zasz Funziona in modo diverso in 1.9.2. Il file inizialmente caricato ha un __FILE__ relativo, ma altri file inclusi / richiesti hanno percorsi assoluti.
Geoff,

9
@LukeBayes È possibile conservare i caratteri di sottolineatura e altri caratteri speciali nei commenti Stack Overflow circondando il testo letterale con i backtick. Scrivi `__FILE__`per ottenere __FILE__.
Rory O'Kane,

62

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.chdirqualsiasi 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 requiredichiarazioni 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.
Alec.Zhou,

28

__FILE__ è il nome file con estensione del file contenente il codice in esecuzione.

In foo.rb, __FILE__sarebbe "foo.rb".

Se foo.rbfossero nella directory, /home/joshallora File.dirname(__FILE__)ritornerebbero /home/josh.


Proprio cercando questo. +1: =) @Ethan
KM Rakibul Islam

1
Un link alla documentazione qui
Ross Attrill,

17

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.


Devi anteporre una barra al percorso relativo:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe,

3
Non si dovrebbe mai codificare il separatore di directory. Usa invece File.join: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Andrew Hodgkinson il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.