Pergunta

Eu estou tentando pegar o ruby por portar um de tamanho médio (não-OO) programa perl.Um dos meus expressões idiomáticas é definir opções como esta:

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

Em perl, eu tipo de grão meus dentes e deixe $opt_v ser (efetivamente) global.

Em ruby,o mais-ou-menos equivalente exato seria

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

onde $opt_verbose é um global que classes de acesso.Ter aulas de saber sobre sinalizadores globais como o que parece ...er ...errada.O que é o OO-idiomáticas maneira de fazer isto?

  • Deixe que a rotina principal de cuidar de todas as opção coisas relacionadas e têm aulas apenas de retorno coisas para ele que é ele que decide como lidar?
  • Ter aulas de implementar opcional comportamento (por exemplo, saber como será detalhado) e definir um modo através de uma attr_writer tipo de coisa?

atualizado: Obrigado pelas respostas, sugerindo optparse, mas eu deveria ter sido mais claro que não como para o processo de linha de comando opções que eu estou perguntando sobre, mas mais o relacionamento entre as opções de linha de comando que efetivamente definir um programa global, o estado e as classes que devem, idealmente, ser independente de que tipo de coisa.

Foi útil?

Solução

Um tempo atrás que eu corri em toda este post de blog (por Todd Werth') que apresentou uma bastante longa, esqueleto para scripts de linha de comando em Ruby.Seu esqueleto utiliza uma abordagem híbrida em que o código do aplicativo é encapsulado em uma classe de aplicação que é instanciado, em seguida, executado por chamar uma "executar" método no objeto da aplicação.Isso permitiu que as opções devem ser armazenados em uma classe de largura variável de instância para que todos os métodos do objeto de aplicativo pode acessá-los sem expô-los a quaisquer outros objetos que possam ser usados no script.

Eu inclinar-se para usar essa técnica, onde as opções estão contidas em um objeto e usar attr_writers ou parâmetros de opção em chamadas de método para passar as opções relevantes para quaisquer objetos adicionais.Desta forma, qualquer código contido na externos classes pode ser isolado a partir das opções de si mesmos, sem a necessidade de se preocupar com a nomenclatura das variáveis na rotina principal de dentro do thingy classe, se suas opções são definidas com um thingy.verbose=true attr_writer ou thingy.process(true) chamada.

Outras dicas

O optparse a biblioteca é parte da distribuição padrão, então você vai ser capaz de usá-lo sem a necessidade de qualquer terceiro coisas.

Eu não tenho usado ele pessoalmente, mas trilhos parece utilizá-lo amplamente e por isso, não rspec, o que eu acho que é bastante sólido voto de confiança

Este exemplo do rails' script/console parece mostrar como usá-lo muito facilmente e bem

O o primeiro hit no google por "o processamento de linha de comando opções em ruby"é um artigo sobre Prostituta o que parece ser uma boa ferramenta para este trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top