Pregunta

Estoy intentando adquirir Ruby trasladando un programa Perl de tamaño mediano (no OO).Uno de mis modismos personales es configurar opciones como esta:

use Getopt::Std;
our $opt_v;  # be verbose
getopts('v');
# and later ...
$opt_v && print "something interesting\n";

En Perl, aprieto los dientes y dejo que $opt_v sea (efectivamente) global.

En rubí, el equivalente más o menos exacto sería

require 'optparse'
    opts.on("-v", "--[no-]verbose", TrueClass, "Run verbosely") {
        |$opt_verbose|
    }
    opts.parse!
end

donde $opt_verbose es un valor global al que pueden acceder las clases.Que las clases sepan sobre banderas globales así parece...ejem...equivocado.¿Cuál es la forma OO-idiomática de hacer esto?

  • ¿Dejar que la rutina principal se encargue de todas las cosas relacionadas con las opciones y que las clases simplemente le devuelvan las cosas que ella decide cómo tratar?
  • ¿Las clases implementan un comportamiento opcional (por ejemplo, saben cómo ser detallados) y establecen un modo a través de una especie de attr_writer?

actualizado: Gracias por las respuestas que sugieren optparse, pero debería haber sido más claro en que no lo es. cómo para procesar las opciones de la línea de comandos por las que estoy preguntando, pero más bien la relación entre las opciones de la línea de comandos que efectivamente establecen un estado global del programa y las clases que idealmente deberían ser independientes de ese tipo de cosas.

¿Fue útil?

Solución

Hace un tiempo me encontré esta publicación de blog (por Todd Werth) que presentó un esqueleto bastante extenso para scripts de línea de comandos en Ruby.Su esqueleto utiliza un enfoque híbrido en el que el código de la aplicación se encapsula en una clase de aplicación de la que se crea una instancia y luego se ejecuta llamando a un método de "ejecución" en el objeto de la aplicación.Esto permitió que las opciones se almacenaran en una variable de instancia de toda la clase para que todos los métodos en el objeto de la aplicación pudieran acceder a ellas sin exponerlas a ningún otro objeto que pudiera usarse en el script.

Me inclinaría por usar esta técnica, donde las opciones están contenidas en un objeto y usar attr_writers o parámetros de opción en llamadas a métodos para pasar opciones relevantes a cualquier objeto adicional.De esta manera, cualquier código contenido en clases externas puede aislarse de las opciones mismas; no es necesario preocuparse por el nombre de las variables en la rutina principal desde dentro del thingy clase si sus opciones están configuradas con un thingy.verbose=true attr_escritor o thingy.process(true) llamar.

Otros consejos

El optar por analizar La biblioteca es parte de la distribución estándar, por lo que podrá usarla sin necesidad de ningún material de terceros.

No lo he usado personalmente, pero Rails parece usarlo ampliamente. y también lo hace rspec, lo que supongo que es un voto de confianza bastante sólido.

Este ejemplo de Rails' script/console parece mostrar cómo usarlo de manera bastante fácil y agradable

El primer golpe en google para "procesando opciones de línea de comando en Ruby" es un artículo sobre Ramera lo cual parece ser una buena herramienta para este trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top