Если я определил метод Ruby в IRB, как мне отредактировать этот метод, не вводя все заново? - PullRequest
17 голосов
/ 13 марта 2012

Скажите, что я запускаю IRB, и я набираю это в консоли:

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

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

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

Спасибо.

Ответы [ 6 ]

16 голосов
/ 13 марта 2012

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

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

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

13 голосов
/ 13 марта 2012

Вы можете легко сделать это в 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 также может быть сконфигурирован )

6 голосов
/ 13 марта 2012

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

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

3 голосов
/ 13 марта 2012

Посмотрите на камень pry - отличная замена IRB.Эти функции могут быть полезны:

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

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

1 голос
/ 06 февраля 2014

Вы можете отредактировать это через 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

0 голосов
/ 14 июля 2019

Начиная с Ruby версии 2.7.0-preview1, редактировать в сеансах IRB можно, если нажать кнопку :

irb multiline edit

Источник: https://www.ruby -lang.org / ru / news / 2019/05/30 / ruby-2-7-0-preview1-release /

...