Эквивалент if __name__ == '__main __' в Ruby

102

Я новичок в Руби. Я хочу импортировать функции из модуля, который содержит инструмент, который я хочу продолжать использовать отдельно. В Python я бы просто сделал это:

def a():
    ...
def b():
    ...
if __name__ == '__main__':
    a()
    b()

Это позволяет мне запускать программу или импортировать ее как модуль для использования a()и / или b()отдельно. Какая эквивалентная парадигма в Ruby?

Имажинист
источник
возможный дубликат запуска библиотеки Ruby из командной строки
Эндрю Гримм
Возможный дубликат запуска библиотеки Ruby из командной строки
rogerdpack 02

Ответы:

131

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

РЕДАКТИРОВАТЬ: Нашел.

if __FILE__ == $0
    foo()
    bar()
end

Но это определенно нечасто.

Matchu
источник
4
В чем причина разделения модулей и скриптов из любопытства?
Imagist
5
Я думаю, это именно то, чем предпочитают заниматься рубисты. Определение модуля - это определение модуля. Если вы хотите выполнить какое-то действие с этим модулем, хорошо, но действие, которое вы выполняете, не является определением модуля.
Matchu
8
Тем не менее, это удобно для тестирования - вы можете поместить туда тесты модулей и запускать их прямо из файла модуля без какой-либо оболочки.
ebneter
3
@Imagist и @ebneter Или наоборот: скрипт - это отдельный модуль, который предназначен для запуска из командной строки, но вы также хотите иметь возможность тестировать его по частям и иметь тест в отдельном модуле. В этом случае NAME == $ 0 бесценен.
Путаница,
16
Я этого тоже не видел, но это не осуждается. Официальные документы Ruby используют его: ruby-lang.org/en/documentation/quickstart/4
cflewis
12

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

if caller.length == 0
  # do stuff
end

Подтверждение концепции:

файл: test.rb

#!/usr/bin/ruby                                                                 

if caller.length == 0
  puts "Main script"
end

puts "Test"

файл: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

Использование:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test
uKolka
источник
1
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

Rubocop предпочитает :

if __FILE__ == $0
    foo()
    bar()
end
ablarg
источник