__FILE__ có nghĩa là gì trong Ruby?


Câu trả lời:


144

Nó là một tham chiếu đến tên tập tin hiện tại. Trong tập tin foo.rb, __FILE__sẽ được hiểu là "foo.rb".

Chỉnh sửa: Ruby 1.9.2 và 1.9.3 có vẻ hành xử hơi khác so với những gì Luke Bayes nói trong bình luận của mình . Với các tệp này:

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

Chạy ruby test.rbsẽ xuất

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

87
Câu trả lời này không chính xác. FILE là đường dẫn "tương đối" đến tệp từ thư mục thực thi hiện tại - không tuyệt đối. Bạn phải sử dụng File.Exand_path ( FILE ) để có được đường dẫn tuyệt đối
Luke Bayes

7
Dấu gạch dưới kép đã được tự động xóa trong phần bình luận ở trên.
Luke Bayes

1
điều này có còn đúng trong ruby ​​1.9.2 không?
Zasz

4
@Zasz Nó hoạt động hơi khác nhau trong 1.9.2. Tệp được tải ban đầu có tương đối __FILE__, nhưng các tệp được bao gồm / bắt buộc khác có đường dẫn tuyệt đối.
Geoff

9
@LukeBayes Bạn có thể lưu giữ dấu gạch dưới và các ký tự đặc biệt khác trong các bình luận Stack Overflow bằng cách bao quanh văn bản bằng chữ với backticks. Viết `__FILE__`để có được __FILE__.
Rory O'Kane

62

Giá trị của __FILE__là một đường dẫn tương đối được tạo và lưu trữ (nhưng không bao giờ được cập nhật) khi tệp của bạn được tải. Điều này có nghĩa là nếu bạn có bất kỳ cuộc gọi Dir.chdirnào đến bất kỳ nơi nào khác trong ứng dụng của mình, đường dẫn này sẽ mở rộng không chính xác.

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

Một cách giải quyết cho vấn đề này là lưu trữ giá trị mở rộng __FILE__bên ngoài của bất kỳ mã ứng dụng nào. Miễn là các requirecâu lệnh của bạn đứng đầu các định nghĩa của bạn (hoặc ít nhất là trước bất kỳ cuộc gọi nào Dir.chdir), giá trị này sẽ tiếp tục hữu ích sau khi thay đổi thư mục.

$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.Đường dẫn mở rộng chính xác theo thử nghiệm của tôi. Phiên bản ruby ​​của tôi là 2.3.7, có thể phiên bản ruby ​​mới hơn đã khắc phục vấn đề này.
Alec.Zhou

28

__FILE__ là tên tệp có phần mở rộng của tệp chứa mã được thực thi.

Trong foo.rb, __FILE__sẽ là "foo.rb".

Nếu foo.rbđã ở trong dir /home/joshthì File.dirname(__FILE__)sẽ trở lại /home/josh.


Chính xác tìm kiếm này. +1: =) @Ethan
KM Rakibul Hồi giáo

1
Liên kết đến tài liệu ở đây
Ross Attrill

17

Trong Ruby, dù sao phiên bản Windows, tôi chỉ kiểm tra và __FILE__không chứa đường dẫn đầy đủ đến tệp. Thay vào đó, nó chứa đường dẫn đến tệp liên quan đến nơi nó được thực thi.

Trong PHP __FILE__là đường dẫn đầy đủ (theo ý kiến ​​của tôi là thích hợp hơn). Đây là lý do tại sao, để làm cho các đường dẫn của bạn di động trong Ruby, bạn thực sự cần phải sử dụng điều này:

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

Tôi nên lưu ý rằng trong Ruby 1.9.1 __FILE__chứa đường dẫn đầy đủ đến tệp, mô tả ở trên là khi tôi sử dụng Ruby 1.8.7.

Để tương thích với cả Ruby 1.8.7 và 1.9.1 (không chắc chắn về 1.9), bạn nên yêu cầu các tệp bằng cách sử dụng cấu trúc tôi đã trình bày ở trên.


Bạn cần phải chuẩn bị một dấu gạch chéo vào đường dẫn tương đối của mình:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe

3
Bạn không bao giờ nên cứng mã phân tách thư mục. Sử dụng File.join thay thế: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Andrew Hodgkinson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.