PRY или IRB - презаредете класа и забравете изтритата функционалност

Ако промените файл и след това го заредите отново в pry или irb, той изглежда ще вземе всяка НОВА функционалност, която сте добавили към този клас, но не забравя СТАРАта функционалност, която сте изтрили от този клас.

Стъпки за възпроизвеждане:

  1. Създайте клас с един метод - напр. say_hello.
  2. Отворете PRY или IRB и load 'my_class.rb'
  3. Редактирайте своя клас - изтрийте съществуващия метод и добавете нов с различно име - напр. say_goodbye
  4. презареди класа си - load 'my_class.rb'

И ДВАТА ви метода вече ще бъдат налични. Разбирам защо това се случва - тъй като ruby ​​ви позволява да отваряте отново класове за модификация, повторното зареждане на вашия файл просто отваря отново съществуващата версия на класа, който вече сте заредили, вместо да изтриете паметта на този клас и да дефинирате класа отново от нулата.

Въпросът ми е как се справяте с това, освен да се откажете и да стартирате отново PRY или IRB? Как просто казвате „забравете напълно предишния ми клас и заредете отново този файл от нулата“?

Благодаря!


person joshua.paling    schedule 22.11.2014    source източник


Отговори (3)


Можете да използвате remove_const, за да премахнете клас от неговия родител, или от Module, в който се намира:

My::Module.send(:remove_const, :MyClass)

или от Object, ако не е деклариран в модул:

Object.send(:remove_const, :MyClass)
person Uri Agassi    schedule 22.11.2014

Ако не е необходимо да презареждате избирателно определени модули, класове и т.н. и искате да запазите вашите локални променливи, просто:

reload!
person VxJasonxV    schedule 19.10.2018

Докато сте нащрек, можете да използвате reset и това ще нулира средата.

За да нулирате IRB, можете да вижте този отговор, което означава exec($0)

Според reset е exec 'pry' (+ някои неща на Pry). $0 в IRB изглежда е "irb", а в pry, $0 е "pry".

$0 е глобална променлива, която означава "работещата програма" и това не е изненадващо.

Погледнете обаче изходния код в Pry за командата за нулиране, донякъде съм изненадан, че се отнасят към pry по име, а не по тази добре позната променлива.

Ето кода от Pry, който дава функционалността за нулиране и защо увеличава използването на паметта.

class Command::Reset < Pry::ClassCommand
  match 'reset'
  group 'Context'
  description 'Reset the REPL to a clean state.'

  banner <<-'BANNER'
    Reset the REPL to a clean state.
  BANNER

  def process
    output.puts 'Pry reset.'
    exec 'pry'
  end
end

Третият ред от последния в този списък е този.

По-чистият начин всъщност е да се грижите сами, както е отговорено от Uri.

person vgoff    schedule 22.11.2014
comment
Изглежда отваря друг Ruby (+ някои библиотеки). Това ви струва още ~80 Mb ram. Може да е грешка в по-старата/Windows версия, но всеки, който опитва това, трябва да е наясно с това. - person Darek Nędza; 22.11.2014
comment
Което отваря друг Ruby и някои библиотеки? Прай ресет или exec($0)? Всеки, който опитва това, трябва да е наясно и с това, @DarekNędza :) - person vgoff; 23.11.2014
comment
А, вярно. Забравих за най-важното. Е, проверих и двете, Pry и IRB, и двете отварят друг ruby.exe. Допълнителна информация за любопитните: reset е exec 'pry' (+ някои неща на Pry). $0 в IRB изглежда е "irb", а в прага $0 е "pry". - person Darek Nędza; 24.11.2014
comment
Нямах предвид exec($0) в pry, тъй като това не е командата за reset pry, а самата команда reset. Въпреки че вътрешно може наистина да използва exec($0). Значи имахте предвид, че и в двата случая паметта се увеличава, когато направите подходящия начин за нулиране? Или искаш да кажеш, че ако заредя самото приложение, то ще се увеличи с толкова памет? - person vgoff; 25.11.2014
comment
Да, когато въведа exec($0) или reset паметта се увеличава. - person Darek Nędza; 26.11.2014