Ответ 1
load
не требует (hmm) полного пути. Он ожидает полного имени файла с расширением.
p load 'date.rb' #=> true
p load 'date.rb' #=> true
p load 'date' #=> LoadError
Есть ли способ принудительно выполнить require
-инирование файла во второй раз?
Я пишу библиотеку, расположенную в пути для Ruby. Я редактирую файл, выполняя его простой тест в IRB.
Каждый раз, когда я вношу изменения в файл, я хочу перезагрузить его, не заканчивая сеанс IRB. Использование load
требует набирать весь путь к файлу каждый раз, а перезапуск IRB каждый раз требует от меня ввода всех других параметров переменной, необходимых для простого теста.
Я просто хочу что-то вроде require
, но это позволяет загружать второй раз. Есть ли простой способ сделать это?
load
не требует (hmm) полного пути. Он ожидает полного имени файла с расширением.
p load 'date.rb' #=> true
p load 'date.rb' #=> true
p load 'date' #=> LoadError
:000> path = "extremely/long/path/to/my/file"
:001> load path
:002> load path
Вы можете написать свой собственный и поместить его в свой .irbrc:
Новая жара
module Kernel
def reload(lib)
if old = $LOADED_FEATURES.find{|path| path=~/#{Regexp.escape lib}(\.rb)?\z/ }
load old
else
require lib
end
end
end
Минуты-старые и поэтому Busted
module Kernel
# Untested
def reload(lib)
if File.exist?(lib)
load lib
else
lib = "#{lib}.rb" unless File.extname(lib)=='.rb'
$:.each do |dir|
path = File.join(dir,lib)
return load(path) if File.exist?(path)
end
end
end
end
Для старой и загруженной версии вам нужно будет сделать ее более надежной, если вы хотите поддерживать RubyGems.
Одна из проблем с любым из этих решений заключается в том, что, хотя он будет принудительно перезагружать файл, о котором идет речь, если этот файл в свою очередь вызывает require
на других (как это обычно бывает с драгоценными камнями), эти файлы не будут перезагружены.
Работа вокруг этого будет очень уродливой. Например, возможно, ручное обращение к массиву $LOADED_FEATURES
и копирование всех путей, которые были связаны с именем gem. Дрожь