`if __name__ == '__main __'` эквивалент в Ruby - PullRequest
96 голосов
/ 12 февраля 2010

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

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

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

Ответы [ 2 ]

124 голосов
/ 12 февраля 2010

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

РЕДАКТИРОВАТЬ: Найдено.

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

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

11 голосов
/ 15 октября 2013

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