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.rb
sẽ 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.chdir
nà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 require
câ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/josh
thì 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") )