2012-04-24 29 views
19

Có cách nào để buộc require -giữ tệp lần thứ hai không?Cách yêu cầu lần thứ hai

Tôi đang viết một thư viện nằm trong đường dẫn cho Ruby. Tôi đang chỉnh sửa các tập tin trong khi làm một bài kiểm tra đơn giản của nó trong IRB.

Mỗi khi tôi thực hiện thay đổi đối với tệp, tôi muốn tải lại tệp đó mà không kết thúc phiên IRB. Sử dụng load yêu cầu nhập toàn bộ đường dẫn đến tệp mỗi lần và khởi động lại IRB mỗi lần yêu cầu tôi nhập tất cả các cài đặt biến khác cần thiết cho thử nghiệm đơn giản.

Tôi chỉ muốn một cái gì đó như require nhưng điều đó cho phép tải lần thứ hai. Có một cách đơn giản để làm điều đó?

+0

Có phải tùy chọn duy nhất là 'IRB'? Bạn có thể sử dụng 'pry'? –

Trả lời

24

load không đòi hỏi (hmm) một đường dẫn đầy đủ. Nó hy vọng một tên tập tin hoàn chỉnh với phần mở rộng.

p load 'date.rb' #=> true 
p load 'date.rb' #=> true 
p load 'date' #=> LoadError 
+0

Tôi biết về sự khác biệt giữa việc có hoặc không có ".rb", nhưng bằng cách nào đó tôi đã không nhận ra về con đường. – sawa

4
:000> path = "extremely/long/path/to/my/file" 
:001> load path 
:002> load path 
4

Bạn có thể viết riêng của bạn và đặt nó trong .irbrc của bạn:

New Hotness

module Kernel 
    def reload(lib) 
    if old = $LOADED_FEATURES.find{|path| path=~/#{Regexp.escape lib}(\.rb)?\z/ } 
     load old 
    else 
     require lib 
    end 
    end 
end 

Minutes-Cũ và Do đó Busted

module Kernel 
    # Untested 
    def reload(lib) 
    if File.exist?(lib) 
     load lib 
    else 
     lib = "#{lib}.rb" unless File.extname(lib)=='.rb' 
     $:.each do |dir| 
     path = File.join(dir,lib) 
     return load(path) if File.exist?(path) 
     end 
    end 
    end 
end 

Đối với phiên bản cũ và busted bạn sẽ phải làm cho nó mạnh mẽ hơn nếu bạn muốn hỗ trợ RubyGems.

Một vấn đề với một trong những giải pháp là trong khi nó sẽ ép lại các tập tin trong câu hỏi, nếu rằng tập tin lần lượt gọi require vào người khác (như thường là trường hợp với đá quý) các tập tin sẽ không được tải lại.

Làm việc xung quanh điều này sẽ thực sự xấu xí. Giống như, có thể tự tay tiếp cận mảng $LOADED_FEATURES và trích xuất tất cả các đường dẫn có liên quan đến tên của đá quý. shudder

+0

Tôi đã chỉnh sửa câu trả lời để bao gồm một phiên bản đơn giản tận dụng lợi thế của ma thuật yêu cầu hiện có. – Phrogz

+0

Cảm ơn sự giúp đỡ. Trên thực tế, câu hỏi của tôi có thể là ngu ngốc. Như câu trả lời của steenslag, tôi có thể không phải lo lắng về con đường sau khi tất cả. Nhưng mã của bạn sẽ hữu ích. – sawa

Các vấn đề liên quan