Piszę małą aplikację wiersza polecenia w języku Ruby, która używa fileutils
ze standardowej biblioteki do operacji na plikach. W zależności od tego, w jaki sposób użytkownik wywołuje aplikację, będę chciał dołączyć: FileUtils
, FileUtils::DryRun
lub FileUtils::Verbose
.Jak mogę wybrać, która wersja modułu ma być dołączana dynamicznie w Ruby?
Ponieważ include
jest prywatny, nie mogę jednak umieścić logiki w metodzie obiektu initialize
. (To była moja pierwsza myśl, od tego czasu mogłem podać informacje o wyborze użytkownika jako parametr do new
.) Wymyśliłem dwie opcje, które wydają się działać, ale nie jestem z nich zadowolony:
Ustaw zmienną globalną w przestrzeni nazw aplikacji w oparciu o wybrane przez użytkownika, a następnie wykonaj warunkowe obejmują w klasie:
class Worker case App::OPTION when "dry-run" include FileUtils::DryRun etc.
Tworzenie podklas, gdzie jedyną różnicą jest to, która wersja
FileUtils
obejmują one. Wybierz odpowiedni, w zależności od wyboru użytkownika.class Worker include FileUtils # shared Worker methods go here end class Worker::DryRun < Worker include FileUtils::DryRun end class Worker::Verbose < Worker include FileUtils::Verbose end
Pierwsza metoda wydaje DRY-ER, ale mam nadzieję, że coś jest prostsze, że nie myśli.
„Więc co” brzmi prosto do mnie. (To była * dokładnie * bardziej bezpośrednia rzecz, której nie widziałem.) Dzięki. – Telemachus
Ups, mój błąd. Kod, który wcześniej podałem, modyfikuje klasę 'Worker', więc wszystkie' Worker' będą używać tych samych ustawień. Teraz faktycznie używa metaklasy i pozwala na ustawienia sprzed pracownika. – taw
zamiast '(class << self; include FileUtils; end)' możesz również użyć 'extend FileUtils'. –