Как некоторые файлы не выполняются, когда они требуются в irb?

Если у меня file.rb:

puts "Hello, World"

затем введите irb:

require "./file.rb"

вывод будет Hello, World.

Зачем тогда, если у меня есть файл sinatra, например

require "sinatra"
get "/" do
    return "Hi"
end

и требовать, чтобы выхода нет?

Разъяснение

Что запускает файл sinatra через ruby sinatra_app.rb, он запускает стоечный сервер и не останавливается, пока не будет нажата CTRL + C. Почему он этого не делает, когда требуется в irb, но делает это, когда явно запускается с ruby sinatra_app.rb?


person thesecretmaster    schedule 29.07.2016    source источник


Ответы (2)


Потому что скрипт ничего не выводит. В показанном вами сценарии нет ничего, что могло бы генерировать какой-либо вывод, нет вызовов print, puts или p, нет writes ни к одному файлу, ничего.

Первый сценарий что-то печатает, когда required, потому что он что-то печатает, второй ничего не печатает, когда required, потому что он ничего не печатает. Удалите вызов puts из первого скрипта, и он тоже ничего не напечатает. Добавьте вызов puts ко второму скрипту, и он что-нибудь напечатает.

person Jörg W Mittag    schedule 29.07.2016
comment
Но почему он не запускает сервер, как и ruby app.rb - person thesecretmaster; 29.07.2016
comment
Обычно этот сценарий запускает сервер, но ничего не делает. - person thesecretmaster; 29.07.2016

Обходной путь требует sinatra, прежде чем запрашивать файл.

Корневой файл:

require "sinatra"
require "/tmp/ddd.rb"

Требуемый файл:

get "/" do
    return "Hi"
end

Думаю, это как-то связано с процессом запуска Sinatra. Они помещают get метод в пространство имен по умолчанию, не отделяя его от модуля.

person teksisto    schedule 29.07.2016
comment
На самом деле это не ответ. Я уже могу догадаться, что это связано с процессом установки sinatras, но я спрашиваю, как конкретно. - person thesecretmaster; 29.07.2016