Если я определил метод Ruby в IRB, как мне изменить этот метод без повторного ввода всего?

Скажем, я запускаю IRB, и я ввожу его в консоль:

def full_name(first, last)
   puts "Your full name is: #{first, ' ', last}"
end

Скажите, что я хотел отредактировать это, чтобы включить параметр middle, как бы я мог вернуть этот же метод и отредактировать список параметров и отредактировать оператор puts, не перепечатывая весь метод?

P.S. Я знаю, что этот пример прост, и я мог бы просто просто перепечатать метод, но у меня есть гораздо большие методы, с которыми я экспериментирую, и я использую этот простой для краткости.

Спасибо.

Ответы

Ответ 1

Вы не можете. Помимо повторного набора/повторной обработки или нажатия , чтобы получить все предыдущие инструкции, но для более длинных методов это может быть очень запутанным.

Почему бы не ввести код в редакторе, а затем сделать load 'mycode.rb' в IRb? Это по существу эквивалентно копированию и вставке текста, а вызов load 'myfile.rb' снова, как обычно, переопределяет существующие определения методов.

Или даже лучше использовать Pry вместо IRB как предложенный bannister ниже (я полностью заменил IRB Pry уже давно).

Ответ 2

Вы можете сделать это легко в Pry (гораздо более мощной альтернативе IRB), просто используйте команду edit-method, чтобы повторно открыть этот метод в редакторе следующим образом:

[19] (pry) main: 0> def full_name(first, last)
[19] (pry) main: 0*   puts "Your full name is: #{first + '' + last}"  
[19] (pry) main: 0* end  
=> nil
[20] (pry) main: 0> edit full_name
Waiting for Emacs...
=> nil
[21] (pry) main: 0> show-method full_name

From: (pry) @ line 32:
Number of lines: 3
Owner: Object
Visibility: public

def full_name(first, middle, last)
  puts "Your full name is: #{first + middle + last}"
end
[22] (pry) main: 0> full_name "Stephen ", "william ", "Hawking"
Your full name is: Stephen william Hawking
=> nil
[23] (pry) main: 0> 

Pry автоматически перезагружает метод после завершения редактирования (использование редактора pry также может )

Ответ 3

Я не думаю, что у вас здесь много вариантов. Обычно я делаю, чтобы поместить код, в который я играю, в файл и использовать load '/path/to/file.rb', чтобы перезагрузить его всякий раз, когда что-то меняю.

Вы также можете попробовать interactive_editor gem, который позволяет вам использовать полномасштабный текстовый редактор для редактирования текста внутри сеанса IRB.

Ответ 4

Посмотрите pry gem - отличная замена для IRB. Это может быть полезно:

  • hist - история воспроизведения команд
  • amend-line - изменение строки в записи в мулитной строке

Они хорошо документированы в pry wiki

Ответ 5

Вы можете отредактировать это через irb или pry (что я настоятельно рекомендую), но вам нужно будет перепечатать все это. Если вы думаете об этом, один метод не так сложно напечатать: P Однако, если у вас есть несколько методов, заключенных в класс, может быть очень утомительным повторить весь класс и соответствующие методы. В этом случае вы можете использовать class_evals.

Class Name
     def full_name(first, last)
       puts "Your full name is: #{first + ' ' + last}"
    end
end

# NEW Edited Code

Name.class_eval do 
  def full_name(first, middle, last)
    puts "Your full name is: #{first + ' ' + middle + ' ' + last}"
  end 
end

Здесь хороший ресурс для чтения о повторных открытиях классов /monkeypatching и здесь другой, который предупреждает о плохих последствиях monkeypatching