Saya melihat ini sepanjang waktu di Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Apa __FILE__artinya
Saya melihat ini sepanjang waktu di Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Apa __FILE__artinya
Jawaban:
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
`__FILE__`untuk mendapatkan __FILE__.
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
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.
__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.
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.
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )