Перезагрузить рубыгем в ИРБ
Есть ли способ "перезагрузить" или "освежить" рубин в памяти? Поскольку я играю в 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!
на скрипте / консоли, но я не знаю, какую магию они используют.
Эта суть выглядит многообещающе, но я ее не проверял.