рубиновые идиомы для использования параметров командной строки

Я пытаюсь подобрать 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, но я должен был быть более ясным, что это не как обрабатывать параметры командной строки, о которых я спрашиваю, а скорее взаимосвязь между параметры командной строки, которые эффективно устанавливают глобальное состояние программы и классы, которые в идеале должны быть независимыми от подобных вещей.


person robc    schedule 02.09.2008    source источник


Ответы (3)


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

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

person Nathan Fritz    schedule 03.09.2008
comment
Примечание: структура URL-адреса Тодда, похоже, немного изменилась; теперь он живет здесь. - person lindes; 27.03.2012

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

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

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

person Orion Edwards    schedule 02.09.2008
comment
устаревшая ссылка для script/console, новая ссылка - github. com / rails / rails / blob / master / railties / lib / rails / commands / - person Steen; 21.11.2013

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

person John    schedule 02.09.2008
comment
Я не понимаю, насколько это женоненавистничество. Они никого не называют, не выносят суждений о чьей-либо распущенности и т. Д. - person John; 03.04.2012
comment
Одно из определений этого слова - женщина, которую считают сексуально неблагонадежной или неразборчивой в сексуальных отношениях. То, что это слово по определению может приписать дурную славу только женскому полу, на мой взгляд, указывает на женоненавистничество. Учитывая это, я считаю, что применение этого термина к чему угодно служит пропагандой женоненавистнического мема: идеи о том, что существуют формы дурной репутации, которые могут относиться только к женщинам. - person lindes; 03.04.2012
comment
Примечание: я не делаю никаких суждений о самом программном обеспечении, я не смотрел на него достаточно внимательно, чтобы сделать это. Просто комментирую его название. - person lindes; 03.04.2012