Apa arti __FILE__ dalam Ruby?

Jawaban:

144

Ini adalah referensi ke nama file saat ini. Dalam file tersebut foo.rb, __FILE__akan diartikan sebagai "foo.rb".

Sunting: Ruby 1.9.2 dan 1.9.3 tampak berperilaku sedikit berbeda dari apa yang dikatakan Luke Bayes dalam komentarnya . Dengan file-file ini:

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

Menjalankan ruby test.rbakan menampilkan

test.rb
/full/path/to/dir2/test.rb
Geoff
sumber
87
Jawaban ini tidak akurat. FILE adalah jalur "relatif" ke file dari direktori eksekusi saat ini - tidak absolut. Anda harus menggunakan File.expand_path ( FILE ) untuk mendapatkan jalur absolut
Luke Bayes
7
Garis bawah ganda secara otomatis dihapus dalam komentar di atas.
Luke Bayes
1
apakah ini masih berlaku di ruby ​​1.9.2?
Zasz
4
@Zasz Bekerja agak berbeda di 1.9.2. File yang awalnya dimuat memiliki __FILE__ relatif, tetapi file lain yang disertakan / diperlukan memiliki jalur absolut.
Geoff
9
@LukeBayes Anda dapat mempertahankan garis bawah dan karakter khusus lainnya dalam komentar Stack Overflow dengan mengelilingi teks literal dengan backtick. Menulis `__FILE__`untuk mendapatkan __FILE__.
Rory O'Kane
62

Nilai __FILE__adalah jalur relatif yang dibuat dan disimpan (tetapi tidak pernah diperbarui) ketika file Anda dimuat. Ini berarti bahwa jika Anda memiliki panggilan ke Dir.chdirtempat lain di aplikasi Anda, jalur ini akan berkembang secara tidak benar.

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

Salah satu solusi untuk masalah ini adalah untuk menyimpan nilai yang diperluas dari __FILE__luar kode aplikasi apa pun. Selama requirepernyataan Anda ada di bagian atas definisi Anda (atau setidaknya sebelum ada panggilan Dir.chdir), nilai ini akan terus berguna setelah mengubah direktori.

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

# open class and do some stuff that changes directory

puts $MY_FILE_PATH
Luke Bayes
sumber
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.Jalur diperluas dengan benar di bawah pengujian saya. Versi ruby ​​saya 2.3.7, mungkin versi ruby ​​yang lebih baru memperbaiki masalah ini.
Alec.Zhou
28

__FILE__ adalah nama file dengan ekstensi file yang berisi kode yang dieksekusi.

Di foo.rb, __FILE__akan menjadi "foo.rb".

Jika foo.rbberada di dir /home/joshmaka File.dirname(__FILE__)akan kembali /home/josh.

Ethan
sumber
Tepat mencari ini. +1: =) @Ethan
KM Rakibul Islam
1
Tautan ke dokumentasi di sini
Ross Attrill
17

Di Ruby, versi Windows, saya hanya memeriksa dan __FILE__tidak berisi path lengkap ke file. Sebaliknya itu berisi path ke file relatif ke tempat itu dieksekusi.

Dalam PHP __FILE__adalah path lengkap (yang menurut saya lebih disukai). Inilah sebabnya, untuk membuat jalur Anda portabel di Ruby, Anda benar-benar perlu menggunakan ini:

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

Saya harus mencatat bahwa di Ruby 1.9.1 __FILE__berisi path lengkap ke file, deskripsi di atas adalah ketika saya menggunakan Ruby 1.8.7.

Agar kompatibel dengan Ruby 1.8.7 dan 1.9.1 (tidak yakin tentang 1.9), Anda harus memerlukan file dengan menggunakan konstruk yang saya perlihatkan di atas.

Matt Wolfe
sumber
Anda perlu menambahkan garis miring ke jalur relatif Anda:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe
3
Anda tidak boleh membuat hard-code pemisah direktori. Gunakan File.join sebagai gantinya: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Andrew Hodgkinson