2013-08-15 6 views
9

Di solito, ho messo la maggior parte delle mie dichiarazioni require nella parte superiore di un file. Durante la lettura del codice sorgente di Poltergeist, ho notato il seguenteQuali sono i vantaggi dell'utilizzo di `require` all'interno di un modulo anziché in alto?

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

Actual source

Quali sono i vantaggi di utilizzare require in questo modo?

risposta

6

Il vantaggio in questo caso è che il modulo Capybara::Poltergeist esiste prima che questi moduli siano richiesti. Poiché questi moduli estendono tutti il ​​modulo Capybara::Poltergeist, questo è solo un modo per assicurarsi che non vengano caricati prima che il modulo sia effettivamente disponibile. Posizionare le istruzioni require dopo la definizione del modulo avrebbe lo stesso effetto.

Si consideri il seguente:

# foobar.rb 
require './bar_module' 

module Foo 
    module Bar 
    end 
end 

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

Questa configurazione non riuscirà perché la Foo::Bar sintassi non-nested si aspetta Foo di esistere già dal momento in cui questo modulo si chiama. Modificando il primo file a:

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

Il richiede funziona, dal momento che Foo::Bar esisterà per il momento che bar_module comincia a fare la sua cosa.

In questo particolare esempio, non ha effetti pratici, poiché Poltergeist utilizza la sintassi nidificata modulo (module Foo; module Bar) anziché la sintassi compresso (module Foo::Bar), ma è una buona pratica che delinea sostanzialmente "questi richiede durante questo modulo per esistere ".

2

Non so qual è il vantaggio nel tuo esempio.

A volte uso require all'interno di una definizione di metodo.

Faccio questo per metodi che vengono utilizzati raramente, ma richiedono librerie di grandi dimensioni. Il vantaggio: la grande libreria viene caricata solo quando è veramente necessaria.

require controlli, se la libreria è già stata caricata. Quindi non ho alcun problema con il doppio caricamento di una libreria.

+0

Non sarebbe meglio usare il metodo di caricamento automatico invece di inserire la richiesta all'interno del metodo? Penso che sarebbe una soluzione più elegante, dal momento che vorrei caricarlo solo quando necessario per la chiamata –

Problemi correlati