Подтвердить что ты не робот

Как потребовать второй раз

Есть ли способ принудительно выполнить require -инирование файла во второй раз?

Я пишу библиотеку, расположенную в пути для Ruby. Я редактирую файл, выполняя его простой тест в IRB.

Каждый раз, когда я вношу изменения в файл, я хочу перезагрузить его, не заканчивая сеанс IRB. Использование load требует набирать весь путь к файлу каждый раз, а перезапуск IRB каждый раз требует от меня ввода всех других параметров переменной, необходимых для простого теста.

Я просто хочу что-то вроде require, но это позволяет загружать второй раз. Есть ли простой способ сделать это?

4b9b3361

Ответ 1

load не требует (hmm) полного пути. Он ожидает полного имени файла с расширением.

p load 'date.rb' #=> true
p load 'date.rb' #=> true
p load 'date'    #=> LoadError

Ответ 2

:000> path = "extremely/long/path/to/my/file"
:001> load path
:002> load path

Ответ 3

Вы можете написать свой собственный и поместить его в свой .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. Дрожь