Ruby - как перезагрузить файл с изменениями в IRB или PRY? - PullRequest
1 голос
/ 13 мая 2019

Я вхожу в irb и требую файл

irb> require_relative 'prime'
irb> true

Этот файл содержит следующий код:

def is_prime? num
  (2..num-1).each do |div_by|
    if num % div_by == 0
      return false
    end 
  end 
  true
end

требует, чтобы файл в irb работал, и я могу использовать метод, например,

irb> require_relative 'prime'
irb> is_prime? 10
irb> -> false

irb> is_prime? 11
irb> -> true

Однако, если я изменю исходный файл, скажем, добавим puts 'HHH', он не появится, пока я не выйду из консоли и не введу заново, а затем require файл

Если я остаюсь в консоли и снова запрашиваю файл, я получаю false, поскольку он уже загружен, и я не получаю новые изменения

Я пытался

irb> reload

и

irb> reload!

но они дают мне

NoMethodError (undefined method `reload!' for main:Object)

Тоже попробовал

irb> load 'prime.rb'
irb> => true

но не взял сдачу

Использование PRY дало аналогичные результаты

Ответы [ 2 ]

4 голосов
/ 13 мая 2019

Попробуйте Kernel#load с относительным путем к файлу rb:

irb> load './path/to/prime.rb'

Kernel#require загружает исходный файл только один раз, тогда как Kernel#load загружает его каждый раз, когда вы вызываете его.

Ссылка https://stackoverflow.com/a/4633535/4950680

3 голосов
/ 13 мая 2019

require просто говорит, что вы буквально «требуете» загрузки другого файла .rb.После загрузки это требование удовлетворяется, и дальнейшие вызовы require с тем же целевым файлом игнорируются.Это позволяет сэкономить, чтобы один и тот же вызов require свободно распространялся на многие исходные файлы - они фактически ничего не сделают после того, как будет выполнен первый.

Вы можете использовать load, чтобы заставить егофактически загрузить файл - это должно делать именно то, что вы ожидаете (require вызывает load после проверки, был ли файл уже необходим).

Обратите внимание, что все это просто, если вы находитесь в простом-old-ruby-контекст (т. е. сами вызывая методы или устанавливая объекты), но может стать немного проблематичным, если задействован один из "больших пушек", также называемый Rails.Rails делает много магии за кулисами, чтобы автоматически требовать пропущенных вещей (следовательно, вы видите так мало явных require вызовов в коде Rails) - что приводит к явным load s в irb, которые иногда, похоже, не имеют никакого эффекта.

...