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

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

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

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

Ответ 1

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

EDIT: Найдено.

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

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

Ответ 2

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

if caller.length == 0
  # do stuff
end

Доказательство концепции:

file: test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"

file: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

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

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test