`if __name__ == '__main __'` еквівалент у Ruby


101

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

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

Це дозволяє мені запустити програму або імпортувати її як модуль для використання a()та / або b()окремо. Яка еквівалентна парадигма в Ruby?



Відповіді:


130

З Ruby, який я бачив у дикій природі (надано, не тонна), це не стандартний шаблон дизайну Ruby. Модулі та сценарії повинні залишатися окремими, тому я не здивуюсь, якщо насправді немає хорошого, чистого способу зробити це.

EDIT: Знайшов.

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

Але це, безумовно, не часто.


4
Які міркування про те, щоб тримати модулі та сценарії окремо, з цікавості?
Імагіст

5
Я думаю, що саме те, що рубісти воліють робити. Визначення модуля - це визначення модуля. Якщо ви хочете виконати якісь дії з цим модулем, добре, але дія, яку ви робите , не є визначенням модуля.
Мачу

8
Це зручно, проте для тестування речей - ви можете помістити тести модулів і запустити їх просто з файлу модуля без обгортки.
ebneter

3
@Imagist і @ebneter Або навпаки: скрипт - це єдиний модуль, який призначений для запуску з командного рядка, але ви також хочете мати можливість протестувати його по частинах і мати тест у окремому модулі. У такому випадку NAME == $ 0 неоціненний.
Плутанина

16
Я цього ще не бачив, але це не нахмурилося. Офіційні документи Ruby використовують його: ruby-lang.org/en/documentation/quickstart/4
cflewis

12

Якщо слід стека порожній, ми можемо розпочати виконання праворуч і ліворуч. Я не знаю, чи використовується це умовно чи нетрадиційно, оскільки я перебуваю в Рубі близько тижня.

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

1
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

Rubocop віддає перевагу над цим:

if __FILE__ == $0
    foo()
    bar()
end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.