2013-08-15 27 views
9

Thông thường, tôi đặt hầu hết các câu lệnh require ở đầu tệp. Trong khi đọc các mã nguồn cho Poltergeist, tôi nhận thấy như sauƯu điểm của việc sử dụng `require` bên trong mô-đun thay vì ở trên cùng là gì?

module Capybara 
    module Poltergeist 
    require 'capybara/poltergeist/utility' 
    require 'capybara/poltergeist/driver' 
    require 'capybara/poltergeist/browser' 
    # more requires 
    end 
end 

Actual source

những lợi thế của việc sử dụng require cách này là gì?

Trả lời

6

Lợi thế trong trường hợp này là mô-đun Capybara::Poltergeist tồn tại trước các mô-đun được yêu cầu. Vì các mô-đun này mở rộng mô-đun Capybara::Poltergeist, đây chỉ là một cách để đảm bảo rằng chúng không được tải trước khi mô-đun thực sự có sẵn. Đặt các câu lệnh require sau khi định nghĩa module sẽ có cùng tác dụng.

xem xét như sau:

# foobar.rb 
require './bar_module' 

module Foo 
    module Bar 
    end 
end 

# bar_module.rb 
module Foo::Bar 
    def baz 
    "hi!" 
    end 
end 

Thiết lập này sẽ thất bại vì không lồng nhau Foo::Bar cú pháp sẽ mong đợi Foo đến đã tồn tại vào thời điểm module này được gọi. Bằng cách thay đổi các tập tin đầu tiên:

module Foo 
    module Bar 
    require './bar_module' 
    end 
end 

Các yêu cầu sẽ làm việc, kể từ Foo::Bar sẽ tồn tại vào thời điểm đó bar_module bắt đầu làm việc của nó. Trong trường hợp cụ thể này, nó không có nhiều hiệu ứng thực tế, vì Poltergeist sử dụng cú pháp mô đun lồng nhau (module Foo; module Bar) thay vì cú pháp thu gọn (module Foo::Bar), nhưng thực hành tốt là cơ bản. để tồn tại ".

2

Tôi không biết lợi thế của bạn là gì.

Đôi khi tôi sử dụng require bên trong định nghĩa phương thức.

Tôi làm điều này cho các phương pháp được sử dụng hiếm khi, nhưng cần thư viện lớn. Ưu điểm: Thư viện lớn chỉ được tải, khi nó thực sự cần thiết.

require kiểm tra, nếu thư viện đã được tải. Vì vậy, tôi không có vấn đề với đôi tải một thư viện.

+0

Sẽ không tốt hơn nếu sử dụng phương pháp tự động tải thay vì chèn các yêu cầu trong phương thức? Tôi nghĩ rằng nó sẽ là một giải pháp thanh lịch hơn, vì tôi chỉ tải nó khi cần thiết cho cuộc gọi –

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