Если я определил метод 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
Ответ 6
Начиная с Ruby версии 2.7.0-preview1, редактирование в сеансах IRB возможно, если нажать кнопку ↑:
![irb multiline edit]()
Источник: https://www.ruby-lang.org/en/news/2019/05/30/ruby-2-7-0-preview1-released/