Должен ли я определить основной метод в моих скриптах ruby? - PullRequest
47 голосов
/ 24 февраля 2009

В Python модуль не не имеет , чтобы иметь основную функцию, но обычной практикой является использование следующей идиомы:

def my_main_function():
    ... # some code

if __name__=="__main__":  # program's entry point
    my_main_function()

Я знаю, что у Руби нет , чтобы иметь метод main, но есть ли какая-то лучшая практика, которой я должен следовать? Должен ли я назвать свой метод main или что-то?

Страница Википедии об основных методах мне не очень помогает.


В качестве примечания я также видел следующую идиому в python:

def my_main_function(args=[]):
    ... # some code

if __name__=="__main__":  # program's entry point
    import sys
    sys.exit(my_main_function(sys.argv))

Ответы [ 5 ]

76 голосов
/ 24 февраля 2009

Я обычно использую

if __FILE__ == $0
  x = SweetClass.new(ARGV)
  x.run # or go, or whatever
end

Так что да, вы можете. Это зависит только от того, что вы делаете.

49 голосов
/ 14 мая 2009

Я всегда находил $PROGRAM_NAME более читабельным, чем при использовании $0. Половину времени, когда я вижу подобные «Perl-подобные» глобалы, я должен посмотреть их.


if __FILE__ == $PROGRAM_NAME
  # Put "main" code here
end
9 голосов
/ 27 января 2011

Вы должны поместить библиотечный код в lib /, а исполняемые файлы, для которых требуется библиотечный код, в bin /. Это дает дополнительное преимущество совместимости с методом упаковки RubyGems.

Распространенным шаблоном является lib / application.rb (или, предпочтительно, имя, которое больше подходит для вашего домена) и bin / application, который содержит:

require 'application'
Application.run(ARGV)
3 голосов
/ 25 февраля 2009

Мое эмпирическое правило таково: момент

if __FILE__ == $0
    <some code>
end

получается длиннее 5 строк, я извлекаю его в функцию main. Это относится как к Python, так и к Ruby-коду. Без этого код просто выглядит плохо структурированным.

0 голосов
/ 24 февраля 2009

номер

Зачем добавлять дополнительный уровень сложности без реальной выгоды? Нет никакого соглашения для Rubyists, которое использует это.

Я бы подождал, пока вам не понадобится второй раз, чтобы использовать его (что, вероятно, случится реже, чем вы думаете), а затем реорганизовал бы его так, чтобы он мог использоваться повторно, что, вероятно, будет включать в себя конструкцию, подобную приведенной выше.

...