Руби идиомы для использования параметров командной строки - PullRequest
4 голосов
/ 02 сентября 2008

Я пытаюсь подобрать ruby, портируя Perl-программу среднего размера (не OO). Одна из моих личных идиом состоит в том, чтобы установить опции как это:

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

В Perl я как бы стискиваю зубы и позволяю $ opt_v (эффективно) быть глобальным.

В рубине более или менее точный эквивалент будет

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

где $ opt_verbose - глобальный объект, к которому могут обращаться классы. Зная, что классы знают о глобальных флагах, кажется ... э ... неправильным. Какой ОО-идиоматический способ сделать это?

  • Пусть основная подпрограмма позаботится обо всем, что связано с опциями, и пусть классы просто возвращают ей то, с чем она решает, как поступить?
  • Могут ли классы реализовать необязательное поведение (например, знать, как быть многословным) и установить режим с помощью attr_writer?

обновлено: Спасибо за ответы, предлагающие optparse, но мне следовало бы прояснить, что это не как обрабатывать параметры командной строки, о которых я спрашиваю, а скорее отношения между параметрами командной строки, которые эффективно устанавливают глобальное состояние программы, и классами, которые в идеале должны быть независимыми от подобных вещей.

Ответы [ 3 ]

3 голосов
/ 03 сентября 2008

Некоторое время назад я наткнулся на это сообщение в блоге (Тодд Верт), в котором представлен довольно длинный скелет для сценариев командной строки в Ruby. Его скелет использует гибридный подход, при котором код приложения инкапсулируется в класс приложения, который создается, а затем выполняется путем вызова метода run для объекта приложения. Это позволило сохранить параметры в переменной класса для всего класса, чтобы все методы в объекте приложения могли получить к ним доступ, не подвергая их воздействию каких-либо других объектов, которые могут быть использованы в сценарии.

Я бы предпочел использовать эту технику, где опции содержатся в одном объекте и используют атрибуты attr_writers или параметры при вызовах методов для передачи соответствующих опций любым дополнительным объектам. Таким образом, любой код, содержащийся во внешних классах, может быть изолирован от самих параметров - не нужно беспокоиться об именовании переменных в основной подпрограмме из класса thingy, если ваши параметры установлены с помощью thingy.verbose=true attr_writer или thingy.process(true) звонок.

2 голосов
/ 02 сентября 2008

Библиотека optparse является частью стандартного дистрибутива, поэтому вы сможете использовать ее без каких-либо сторонних материалов.

Я не использовал это лично, но рельсы, кажется, используют это широко и так же, как rspec , что, я думаю, является довольно солидным вотумом доверия

Этот пример из rails 'script/console, кажется, показывает, как использовать его довольно легко и красиво

1 голос
/ 02 сентября 2008

Первый запрос в Google для " параметров командной строки в ruby ​​" - это статья о Trollop , которая, кажется, является хорошим инструментом для этой работы. .

...