Перезагрузить рубыгем в ИРБ

Есть ли способ "перезагрузить" или "освежить" рубин в памяти? Поскольку я играю в irb, иногда мне нравится модифицировать мои гем-файлы, и если мне требуется тот же гем, он не обновляется в памяти и выдает "false". В настоящее время я должен выйти из IRB, вернуться в IRB и затем снова потребовать драгоценный камень, должен быть лучший способ... что это?

3 ответа

Решение

Как и другие, вы можете использовать Kernel#load. Однако не тратьте свое время на поиск и загрузку каждого файла gem, поскольку все требуемые файлы хранятся в $". Вооружившись этими знаниями, вот команда reload irb:

 def reload(require_regex)
  $".grep(/^#{require_regex}/).each {|e| load(e) }
 end

Например, если вы использовали гем hirb в irb, вы бы просто перезагрузили:

>> reload 'hirb'

Если по какой-либо причине загрузка не работает (это относится к расширениям файлов больше, чем требуется), вы можете повторно запросить любой файл, сначала удалив его запись в $". С этим советом приведенная выше команда будет такой:

 def reload(require_regex)
   $".grep(/^#{require_regex}/).each {|e| $".delete(e) && require(e) }
 end

Выберите тот, который работает для вас. Лично я пользуюсь последним.

Загрузить "filename.rb"

по одному для каждого, что было изменено...

Одним из способов является использование Kernel#load, Вы можете использовать его в значительной степени как Kernel#requireза исключением того, что вы должны явно включить расширение файла. Однако у него есть свои недостатки (даже такие простые, как class Foo < Struct.new(:foo); end не удается, так как невозможно изменить суперкласс класса), поэтому я также хотел бы узнать лучший способ сделать это.

В рельсах вы можете добиться этого с reload! на скрипте / консоли, но я не знаю, какую магию они используют.

Эта суть выглядит многообещающе, но я ее не проверял.

Другие вопросы по тегам