ฉันเห็นสิ่งนี้ตลอดเวลาใน Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
อะไร__FILE__
หมายถึง?
ฉันเห็นสิ่งนี้ตลอดเวลาใน Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
อะไร__FILE__
หมายถึง?
คำตอบ:
มันเป็นการอ้างอิงถึงชื่อไฟล์ปัจจุบัน ในแฟ้มfoo.rb
, จะถูกตีความว่าเป็น__FILE__
"foo.rb"
แก้ไข:ทับทิม 1.9.2 และ 1.9.3 ปรากฏการทำงานเล็ก ๆ น้อย ๆ ที่แตกต่างจากสิ่งที่ลุคเบส์กล่าวว่าในความคิดเห็นของเขา ด้วยไฟล์เหล่านี้:
# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__
วิ่งruby test.rb
จะส่งออก
test.rb
/full/path/to/dir2/test.rb
`__FILE__`
__FILE__
ค่าของ__FILE__
เป็นเส้นทางสัมพัทธ์ที่สร้างและเก็บไว้ (แต่ไม่เคยอัปเดต) เมื่อโหลดไฟล์ของคุณ ซึ่งหมายความว่าหากคุณมีสายDir.chdir
ใด ๆ ในแอปพลิเคชันของคุณเส้นทางนี้จะขยายอย่างไม่ถูกต้อง
puts __FILE__
Dir.chdir '../../'
puts __FILE__
วิธีการหนึ่งในการแก้ไขปัญหานี้คือการจัดเก็บค่าที่ขยาย__FILE__
ออกไปภายนอกของรหัสแอปพลิเคชันใด ๆ ตราบใดที่require
ข้อความของคุณอยู่ด้านบนสุดของคำจำกัดความของคุณ (หรืออย่างน้อยก็ก่อนที่จะโทรหาDir.chdir
) ค่านี้จะยังคงมีประโยชน์หลังจากเปลี่ยนไดเรกทอรี
$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.
เส้นทางขยายอย่างถูกต้องภายใต้การทดสอบของฉัน รุ่นทับทิมของฉันคือ 2.3.7 อาจเป็นรุ่นทับทิมรุ่นใหม่ที่แก้ไขปัญหานี้ได้
__FILE__
เป็นชื่อไฟล์ที่มีนามสกุลไฟล์ที่มีรหัสที่ถูกเรียกใช้งาน
ในfoo.rb
, __FILE__
จะเป็น "foo.rb"
หากfoo.rb
อยู่ในแบบ dir /home/josh
แล้วจะกลับมาFile.dirname(__FILE__)
/home/josh
ใน Ruby, Windows เวอร์ชั่นยังไงก็ตามฉันเพิ่งตรวจสอบและ__FILE__
ไม่มีเส้นทางแบบเต็มไปยังไฟล์ แต่จะมีเส้นทางไปยังไฟล์ที่สัมพันธ์กับตำแหน่งที่ถูกเรียกใช้งาน
ใน PHP __FILE__
เป็นเส้นทางแบบเต็ม (ซึ่งในความคิดของฉันเป็นที่ต้องการ) นี่คือสาเหตุที่ทำให้พา ธ ของคุณพกพาใน Ruby คุณจำเป็นต้องใช้สิ่งนี้:
File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
ฉันควรทราบว่าใน Ruby 1.9.1 __FILE__
มีเส้นทางแบบเต็มไปยังไฟล์คำอธิบายข้างต้นนั้นใช้สำหรับเมื่อฉันใช้ Ruby 1.8.7
เพื่อให้เข้ากันได้กับ Ruby 1.8.7 และ 1.9.1 (ไม่แน่ใจเกี่ยวกับ 1.9) คุณควรต้องการไฟล์โดยใช้โครงสร้างฉันแสดงข้างต้น
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )