¿Cómo puedo elegir qué versión de un módulo incluir dinámicamente en Ruby?
Estoy escribiendo una pequeña aplicación de línea de comandos Ruby que usafileutils
de la biblioteca estándar para operaciones de archivos. Dependiendo de cómo el usuario invoca la aplicación, querré incluir cualquieraFileUtils
, FileUtils::DryRun
oFileUtils::Verbose
.
Ya queinclude
es privado, sin embargo, no puedo poner la lógica para elegir en el objetoinitialize
método. (Ese fue mi primer pensamiento, desde entonces pude pasar la información sobre la elección del usuario como parámetro paranew
.) Se me ocurrieron dos opciones que parecen funcionar, pero tampoco estoy contento con ellas:
Establezca una variable global en el espacio de nombres de la aplicación según la elección del usuario, y luego haga una inclusión condicional en la clase:
class Worker
case App::OPTION
when "dry-run"
include FileUtils::DryRun
etc.
Cree subclases, donde la única diferencia es qué versión deFileUtils
Incluyen. Elija el apropiado, dependiendo de la elección del usuario.
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
El primer método parece SECO, pero espero que haya algo más directo en lo que no he pensado.