如果我在IRB中定义了一个Ruby方法,如何在不重新输入所有内容的情况下编辑该方法?

时间:2012-03-12 22:58:59

标签: ruby irb

假设我正在运行IRB并将其输入控制台:

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

说,我想编辑它以包含参数middle,我将如何重新启动相同的方法并编辑参数列表并编辑puts语句而无需重新键入整个方法?

P.S。我知道这个例子很简单,我可以很容易地重新输入方法,但是我正在尝试使用更大的方法,为了简洁我使用这个简单的方法。

感谢。

6 个答案:

答案 0 :(得分:16)

你做不到。除了重新输入/重新输入,或者按来获取之前的所有语句,但对于更长的方法,这可能会非常混乱。

为什么不在编辑器中键入代码,然后在IRb中执行load 'mycode.rb'?这基本上等同于复制并粘贴文本,并且像往常一样再次调用load 'myfile.rb'将覆盖现有的方法定义。

或者更好的是,使用Pry而不是IRB作为suggested by bannister below(我很久以前就完全用Pry替换了IRB)。

答案 1 :(得分:13)

您可以在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在编辑完成后自动重新加载方法(编辑器撬使用的也可以是configured

答案 2 :(得分:6)

我认为你没有很多选择。我通常做的是将我正在播放的代码放在一个文件中,并在我改变某些内容时使用load '/path/to/file.rb'重新加载它。

您还可以尝试interactive_editor gem,它允许您在IRB会话中使用完整的文本编辑器进行文本编辑。

答案 3 :(得分:3)

查看pry宝石 - 非常适合IRB。此功能可能会有所帮助:

  • hist - 重播命令历史
  • amend-line - 更改多行条目中的一行

pry wiki

上有详细记录

答案 4 :(得分:1)

你可以通过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

Here's a good resource to read about re-opening classes/monkeypatchinghere's another that warns about the bad effects of monkeypatching

答案 5 :(得分:0)

从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/