Tôi thấy điều này mọi lúc trong Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Có __FILE__nghĩa là gì?
Tôi thấy điều này mọi lúc trong Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Có __FILE__nghĩa là gì?
Câu trả lời:
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
`__FILE__`để có được __FILE__.
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.
__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.
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.
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )