__FILE__ หมายถึงอะไรใน Ruby


คำตอบ:


144

มันเป็นการอ้างอิงถึงชื่อไฟล์ปัจจุบัน ในแฟ้ม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

87
คำตอบนี้ไม่ถูกต้อง FILEคือเส้นทาง "สัมพัทธ์" ไปยังไฟล์จากไดเรกทอรีการดำเนินการปัจจุบัน - ไม่ใช่แบบสัมบูรณ์ คุณต้องใช้ File.expand_path ( FILE ) เพื่อให้ได้เส้นทางแน่นอน
ลุคเบส์

7
เครื่องหมายขีดล่างคู่ถูกลบโดยอัตโนมัติภายในความคิดเห็นด้านบน
ลุคเบย์

1
ยังคงเป็นจริงในทับทิม 1.9.2?
Zasz

4
@Zasz มันทำงานได้แตกต่างกันใน 1.9.2 ไฟล์ที่โหลดในตอนแรกมีสัมพัทธ์ __FILE__ แต่ไฟล์ที่รวม / ที่จำเป็นอื่น ๆ มีเส้นทางที่แน่นอน
Geoff

9
@LukeBayes คุณสามารถรักษาขีดล่างและอักขระพิเศษอื่น ๆ ในความคิดเห็น Stack Overflow โดยล้อมรอบข้อความตามตัวอักษรด้วย backticks เขียนที่จะได้รับ`__FILE__` __FILE__
Rory O'Kane

62

ค่าของ__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 อาจเป็นรุ่นทับทิมรุ่นใหม่ที่แก้ไขปัญหานี้ได้
Alec.Zhou

28

__FILE__ เป็นชื่อไฟล์ที่มีนามสกุลไฟล์ที่มีรหัสที่ถูกเรียกใช้งาน

ในfoo.rb, __FILE__จะเป็น "foo.rb"

หากfoo.rbอยู่ในแบบ dir /home/joshแล้วจะกลับมาFile.dirname(__FILE__)/home/josh


มองหาสิ่งนี้อย่างแน่นอน +1: =) @Ethan
KM Rakibul Islam

1
ลิงก์ไปยังเอกสารประกอบที่นี่
Ross Attrill

17

ใน 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")
Felix Rabe

3
คุณไม่ควรเขียนโค้ดตัวคั่นไดเรกทอรีอย่างหนัก ใช้ File.join แทน: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Andrew Hodgkinson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.