Zaletą w tym przypadku jest to, że moduł Capybara::Poltergeist
istnieje, zanim te moduły będą wymagane. Ponieważ moduły te rozszerzają moduł Capybara::Poltergeist
, jest to po prostu sposób na zapewnienie, że nie zostaną załadowane, zanim moduł będzie faktycznie dostępny. Umieszczenie instrukcji require po definicji modułu miałoby taki sam efekt.
Rozważmy następujący:
# foobar.rb
require './bar_module'
module Foo
module Bar
end
end
# bar_module.rb
module Foo::Bar
def baz
"hi!"
end
end
Taka konfiguracja nie powiedzie się, ponieważ nie zagnieżdżony składnia Foo::Bar
będą oczekiwać Foo
do już istniejących w chwili moduł ten jest nazywany. Zmieniając pierwszy plik do:
module Foo
module Bar
require './bar_module'
end
end
wymagać będzie działać, ponieważ Foo::Bar
będzie istnieć do czasu, bar_module
zaczyna robić swoje rzeczy.
W tym konkretnym przypadku, to nie ma większego praktycznego skutku, ponieważ Duch używa zagnieżdżonego modułu składni (module Foo; module Bar
) zamiast zawalonej składni (module Foo::Bar
), ale jest to dobra praktyka, która zasadniczo wyznacza „To wymaga tego spodziewać moduł istnieje ".
Czy nie lepiej zastosować metodę autoload zamiast wstawiania żądania w metodzie? Myślę, że byłoby to bardziej eleganckie rozwiązanie, ponieważ ładowałem je tylko wtedy, gdy było to potrzebne podczas rozmowy –